Псевдоним для шаблонов 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

идея в том, что если я хочу переключаться между boost interprocess " несколько различных опций для общей памяти и распределителей, я просто изменяю typedefs. К сожалению, распределители являются шаблонами, поэтому я не могу ввести распределитель, который хочу использовать.

есть ли способ получить псевдоним шаблона в C++? (За исключением очевидного #define ALLOCATOR_T boost::interprocess::adaptive_pool)

2 ответов


да (если я правильно понял ваш вопрос) вы можете "обернуть" шаблон в структуру типа:

template<typename T>
class SomeClass;

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

и использовать его как:

MyTypeDef<T>::type

Edit: 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) { }
};

EDIT: забудьте этот ответ. Я голосую за @Akanksh.