2010-06-27 8 views
6

voglio funzionalità simili a quelle di seguito:discriminare tra typedef per stesso tipo in C++

typedef int A; 
typedef int B; 


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

Io uso le typedef nel mio programma per denotare l'utilizzo logicamente diversa dello stesso tipo. Quindi, mi piacerebbe creare oggetto di tipo foo in modo diverso per diversi typedef. Potrei compilarlo in g ++, ma msvc lancia una battuta dicendo che foo (A) è già definito quando vede la seconda definizione foo (B). Ho pensato di utilizzare una lista tipo e la posizione di un tipo nell'elenco di discriminare tra i typedef e provato ad utilizzare un boost :: :: 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) {} 
}; 

ma purtroppo, trovare troppo scarta il mio typedef e proprio restituisce iteratore per A in entrambi i casi. Ho anche pensato di definire un enum e utilizzarlo per ogni tipo

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

e l'utilizzo di questo int2type e di tipo B nel programma. Ma questo mi sembra inelegante in quanto è soggetto a errori. Vorrei usare una lista di caratteri e fare questo, in modo che sia chiaro quali tipi sarebbero supportati.

Per favore fatemi sapere se esiste un modo generico ed estensibile per farlo.

risposta

8

A boost strong typedef dovrebbe fare quello che stai cercando.

#include <boost/strong_typedef.hpp> 

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

Grazie. Proprio quello che stavo cercando. – Venkatesan