2010-04-23 23 views
6
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 

La idea es que si quiero cambiar entre el impulso entreprocesamiento 'varias opciones diferentes para memoria compartida y asignadores, simplemente modifico el typedefs. Lamentablemente, los asignadores son plantillas, por lo que no puedo tipear el asignador que quiero usar.Alias ​​para una plantilla C++?

¿Hay alguna manera de lograr un alias para una plantilla en C++? (Excepto por el obvio #define ALLOCATOR_T boost::interprocess::adaptive_pool)

Respuesta

17

Sí, (si entiendo bien su pregunta) se puede "envolver" la plantilla en una estructura como:

template<typename T> 
class SomeClass; 

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

y utilizarlo como:

MyTypeDef<T>::type 

Editar: C++ 0x apoyaría algo así como

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

Edit2: En caso de que su ejemplo

typedef boost::interprocess::adaptive_pool allocator_t; 

puede ser

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

y se utiliza como

allocator_t<SomeClass>::type 
+0

¡Gracias! El método de envoltura hizo el truco. No pude obtener el ejemplo C++ 0x trabajando en gcc 4.4.1 usando -std = C++ 0x. 'template typedef boost :: interprocess :: adaptative_pool allocator_t;' gives' error: declaración de plantilla de 'typedef'' – porgarmingduod

1

C++ no es compatible con esto, aunque está programado para ser reparado en el nuevo estándar. Puede obtener una nueva plantilla de clase de adaptive_pool si no hay constructores no triviales (o si está feliz de escribir algunos constructores de reenvío).

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

EDITAR: Olvida esta respuesta. Mi voto va a @Akanksh.

+0

Derivación de una plantilla de clase de otra clase tiene el problema de que se convierte en un tipo diferente, por lo que cualquier funciones que toman la clase de referencia anteriormente mencionado se no trabajo. Con envolver el nombre de clase en una estructura, el tipo permanece igual y actúa como un typedef, es decir, es del mismo tipo. – Akanksh

Cuestiones relacionadas