2010-12-22 13 views
7

Estoy buscando una forma de mapear tipos, f.i. tener una clase doble:mapeo tipo por plantillas

class Double 
{ 
public: 
    typedef double basic_type; 
    ... 
}; 

me gustaría ser capaz de tener una máquina de colada tipo de manera que

typeid(TypeToObjectType<double>::type) == typeid(Double) 

Alguna idea de cómo lograr esto (a través de especializaciones parciales, etc.)?

Respuesta

9

Todo esto es posible gracias a la especialización:

template<class T> 
struct TypeToObjectType; 

template<> 
struct TypeToObjectType<double> { 
    typedef Double type; 
}; 

Tenga en cuenta que usted tiene que proporcionar una especialización para cada uno de los tipos en los que desea TypeToObjectType para trabajar. Las macros pueden ser útiles aquí:

#define SPECIALIZE_TYPETOOBJECTTYPE(ObjectType) \ 
    template<> struct TypeToObjectType<ObjectType::basic_type> { \ 
     typedef ObjectType type; \ 
    }; 

SPECIALIZE_TYPETOOBJECTTYPE(Int) 
SPECIALIZE_TYPETOOBJECTTYPE(Double) 
+0

Gracias, casi lo tenía :) Esto es justo lo que quería. – Robert

4

suena como usted está buscando algo como esto:

template<typename T> 
struct TypeToObjectType; 

// specialization for T=double  
template<> 
struct TypeToObjectType<double> { 
    typedef Double type; 
}; 

Aquí es TypeToObjectType<double>::typeDouble y se pueden añadir otras especialidades para las asignaciones adicionales.