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