Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alias for a C++ template?

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

The idea is that if I want to switch between boost interprocess' several different options for shared memory and allocators, I just modify the typedefs. Unfortunately the allocators are templates, so I can't typedef the allocator I want to use.

Is there a way to achieve an alias to a template in C++? (Except for the obvious #define ALLOCATOR_T boost::interprocess::adaptive_pool)

like image 764
porgarmingduod Avatar asked Apr 23 '10 09:04

porgarmingduod


People also ask

What is type alias in C?

typedef is a reserved keyword in the programming languages C and C++. It is used to create an additional name (alias) for another data type, but does not create a new type, except in the obscure case of a qualified typedef of an array type where the typedef qualifiers are transferred to the array element type.

What are type aliases?

Type aliases Type aliases provide alternative names for existing types. If the type name is too long you can introduce a different shorter name and use the new one instead. It's useful to shorten long generic types. For instance, it's often tempting to shrink collection types: typealias NodeSet = Set<Network.

What is an alias C++?

You can use an alias declaration to declare a name to use as a synonym for a previously declared type. (This mechanism is also referred to informally as a type alias). You can also use this mechanism to create an alias template, which can be useful for custom allocators.


1 Answers

Yes, (if I understand your question correctly) you can "wrap" the template into a struct like:

template<typename T>
class SomeClass;

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

and use it as:

MyTypeDef<T>::type

Edit: C++0x would support something like

template<typename T>
using MyType = SomeClass<T>;

Edit2: In case of your example

typedef boost::interprocess::adaptive_pool allocator_t;

can be

template<typename T>
struct allocator_t
{
    typedef boost::interprocess::adaptive_pool<T> type;
}

and used as

allocator_t<SomeClass>::type
like image 193
Akanksh Avatar answered Sep 21 '22 06:09

Akanksh