我想設計一個類模板,它採用分配器類型(如標準部分17.6.3.5中定義的)作爲模板參數。我看到std::allocator_traits<A>
如何用缺省設置幫助填充缺少的A
成員。除此之外,標準庫中還有什麼可以幫助正確使用分配器?std :: allocator_traits的使用<A>
特別是:
爲了紀念像
std::allocator_traits<A>::propagate_on_container_copy_assignment
的類型定義,我要在其中有A
類型的成員每個類的特殊成員函數來檢查這些東西呢?或者是有一些包裝類型,我可以使用作爲一個成員,而不是會照顧這個東西?如果我想通過在用戶可見對象旁邊存儲額外的數據來減少分配數量,是否適合重新分配這樣的分配器?
。
template<typename T, typename A>
class MyClass
{
private:
//...
struct storage {
int m_special_data;
T m_obj;
};
typedef typename std::allocator_traits<A>::template rebind_alloc<storage>
storage_alloc;
typedef typename std::allocator_traits<A>::template rebind_traits<storage>
storage_traits;
storage_alloc m_alloc;
static T* alloc(T&& obj)
{
storage_traits::pointer sp = storage_traits::allocate(m_alloc, 1);
sp->m_special_data = 69105;
return ::new(&sp->m_obj) T(std::move(obj));
}
//...
};
「分配的任何其他類型不能使用'construct'」與建議'storage_traits :: construct(m_alloc,&sp);',或者因爲rebind'沒有計數嗎?如果我構建'存儲'並且它仍然有一個'T'類型的成員,那麼這個成員將與'storage'一起構造,而不是'construct',所以我需要從'''''''''''''''無效'技巧? – aschepler 2012-06-16 22:37:45
@aschepler,+1,很好被發現!現在修復,謝謝 – 2012-06-17 12:32:21
至於你的第二個問題,是的,你可以使用一個聯合體,或者一個適當大小和適當對齊的'char'數組。經驗表明,除了'T'之外,確保'storage'只包含可以構造的數據是很容易的,所以你可以''構造'T'並簡單地給其他部分賦值(通常只是指針和/或整數)。我會編輯我的回答r來反映這一點。 – 2012-06-17 18:33:34