C++模板的别名?
问题描述:
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
)
答
是,(如果我没有理解你的问题),你可以 “包装” 的模板到像一个结构:
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
答
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
谢谢!包装方法取得了诀窍。我无法使用-std = C++ 0x获取在gcc 4.4.1中工作的C++ 0x示例。 '模板的typedef升压::进程间:: adaptive_pool allocator_t;''给出错误:“typedef''的模板声明 –
porgarmingduod
2010-04-23 10:23:14