Псевдоним для шаблона C ++? - PullRequest
6 голосов
/ 23 апреля 2010
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 ]

17 голосов
/ 23 апреля 2010

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

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
1 голос
/ 23 апреля 2010

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.

...