我的任務是將一些代碼移植到 c 20。其中一部分是一個模板分配器,用于處理一些奇怪的需求或 Microsoft COM 物件,因此我們可以在向量中使用它們。在某種程度上,它通過 CoTaskMemAlloc/CoTaskMemFree 分配/取消分配記憶體。它還提供了 c 20 中的構造和銷毀的專門化。
例如:
// VARIANT
inline void CnvCoTaskAlloc<VARIANT>::construct(VARIANT* p, const VARIANT& val){
::VariantCopy( p, const_cast<VARIANT*>( &val ) );
}
inline void CnvCoTaskAlloc<VARIANT>::destroy(VARIANT* p){
::VariantClear( p );
}
我很難弄清楚如何將此代碼遷移到 c 20。如果我能找到一個實作構造的類似操作的示例,我很確定這將是顯而易見的。
提前致謝。
uj5u.com熱心網友回復:
該標準對專門化標準庫模板([namespace.std]/2)有以下說法:
除非明確禁止,否則程式可以將任何標準庫類模板的模板特化添加到命名空間
std,前提是 (a) 添加的宣告依賴于至少一種程式定義的型別,并且 (b) 特化滿足原始標準庫的要求模板。
std::allocator_traits<Alloc>::construct該標準為([allocator.traits.members]/5)指定了以下行為:
template<class T, class... Args> static constexpr void construct(Alloc& a, T* p, Args&&... args);效果:如果呼叫
a.construct(p, std::forward<Args>(args)...)格式正確,則呼叫;否則,呼叫construct_at(p, std::forward<Args>(args)...).
因此,如果您選擇專門std::allocator_traits<MyAlloc>::construct化 ,它必須做與主模板基本相同的事情:MyAlloc::construct如果可能,它將呼叫,否則construct_at.
這表明專業化std::allocator_traits通常不是您想要做的。相反,就像 C 20 之前的版本一樣,您只需要確保它MyAlloc::construct包含您想要的邏輯。如果你想要默認值,你甚至可以MyAlloc::construct完全省略,并且std::allocator_traits會處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467078.html
