2010-06-27 12 views
6

Quiero una funcionalidad similar a la de abajo:El discriminar entre typedefs a mismo tipo en C++

typedef int A; 
typedef int B; 


struct foo 
{ 
    foo(A a) { /*specific to type A*/ } 
    foo(B b) { /*specific to type B*/ } 
}; 

utilizo el typedefs en mi programa para denotar el uso lógicamente diferente del mismo tipo. Entonces, me gustaría crear un objeto de tipo foo de forma diferente para diferentes typedefs. Podría compilar esto en g ++, pero msvc arroja un ajuste diciendo que foo (A) ya está definido cuando ve la segunda definición foo (B). Pensé en el uso de una lista tipo y la posición de un tipo en la lista de discriminar entre los typedefs y intentado utilizar un impulso :: :: vector MPL:

#include <boost/mpl/vector.hpp > 
#include <boost/mpl/find.hpp> 

typedef int A; 
typedef int B; 


struct foo 
{ 
    typedef boost::mpl::vector<A, B> supported_types; 

    foo(boost::mpl::find<supported_types, A>::type, A a) {} 
    foo(boost::mpl::find<supported_types, B>::type, B b) {} 
}; 

pero, por desgracia, se encuentra demasiado a mi descarta typedef y justo devuelve el iterador para A en ambos casos. También pensé en la definición de una enumeración y usarlo para cada tipo

enum { TYPE_A, TYPE_B }; 
template <int i> struct int2type {}; 

y utilizar este int2type y tipo B en el programa. Pero esto me parece poco elegante ya que es propenso a errores. Me gustaría utilizar una lista de tipos y hacer esto, para que quede claro qué tipos serían compatibles.

Háganme saber si existe una forma genérica y extensible de hacerlo.

Respuesta

8

A boost strong typedef debe hacer lo que está buscando.

#include <boost/strong_typedef.hpp> 

BOOST_STRONG_TYPEDEF(int, A); 
BOOST_STRONG_TYPEDEF(int, B); 
+0

Gracias. Justo lo que estaba buscando. – Venkatesan

Cuestiones relacionadas