2010-04-23 103 views
6
typedef boost::interprocess::managed_shared_memory::segment_manager 
    segment_manager_t; // Works fine, segment_manager is a class 
typedef boost::interprocess::adaptive_pool 
    allocator_t; // Can't do this, adaptive_pool is a template 

的想法是,如果我想升壓進程間共享內存和分配器幾個不同的選項之間進行切換,我只是修改的typedef。不幸的是,分配器是模板,所以我不能typedef我想要使用的分配器。C++模板的別名?

有沒有辦法實現的別名在C++模板? (除明顯#define ALLOCATOR_T boost::interprocess::adaptive_pool

回答

17

是,(如果我沒有理解你的問題),你可以 「包裝」 的模板到像一個結構:

template<typename T> 
class SomeClass; 

template<typename T> 
struct MyTypeDef 
{ 
    typedef SomeClass<T> type; 
}; 

,並用它作爲:

MyTypeDef<T>::type 

編輯:C++ 0X將支持類似

template<typename T> 
using MyType = SomeClass<T>; 

EDIT2:在您的例子的情況下

typedef boost::interprocess::adaptive_pool allocator_t; 

可以是

template<typename T> 
struct allocator_t 
{ 
    typedef boost::interprocess::adaptive_pool<T> type; 
} 

並用作

allocator_t<SomeClass>::type 
+0

謝謝!包裝方法取得了訣竅。我無法使用-std = C++ 0x獲取在gcc 4.4.1中工作的C++ 0x示例。 '模板的typedef升壓::進程間:: adaptive_pool allocator_t;''給出錯誤:「typedef''的模板聲明 – porgarmingduod 2010-04-23 10:23:14

1

C++不支持此,雖然它被提名固定在新的標準。你可能會逃脫從adaptive_pool派生新類模板,如果沒有非平凡的構造函數(或者,如果你很高興寫了幾轉發構造函數)。

template <class T> 
class allocator_t : public adaptive_pool<T> { 
public: 
    // Just making up a forwarding constructor as an example. I know nothing 
    // anything about adaptive_pool. 
    allocator_t(int arg1, float arg2) : adaptive_pool<T>(arg1, arg2) { } 
}; 

編輯:忘記這個答案。我的投票去@Akanksh。

+0

派生從另一個類的類模板具有它成爲一個不同類型的問題,從而採取的基類的任何函數將不行。隨着包裝類名成一個結構,類型保持不變,其作用就像一個typedef,即它是完全相同的類型。 – Akanksh 2010-04-23 10:00:07