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
Идея состоит в том, что, если я хочу переключить между межпроцессом повышения несколько различных вариантов для общей памяти и средства выделения, я просто изменяю определения типов. К сожалению, средства выделения являются шаблонами, таким образом, я не могу определение типа средство выделения, я хочу использовать.
Существует ли способ достигнуть псевдонима к шаблону в 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.