2013-08-20 13 views
6

Jak zdefiniować mocne typy identyfikatorów w C++ 11? Możliwe jest wykonywanie aliasów z typami całkowitymi, ale otrzymywanie ostrzeżeń od kompilatora podczas mieszania typów?Jak zdefiniować mocne typy identyfikatorów w C++ 11?

Np:

using monsterID = int; 
using weaponID = int; 

auto dragon = monsterID{1}; 
auto sword = weaponID{1}; 

dragon = sword; // I want a compiler warning here!! 

if(dragon == sword){ // also I want a compiler warning here!! 
    // you should not mix weapons with monsters!!! 
} 
+3

Nie można tego zrobić z typedefs. Twórz nowe typy. Coś jest w Boost IIRC. –

+0

http://stackoverflow.com/q/18251447/560648 –

+1

zainteresowania jest proponowana nowa funkcja dla C++ 1r: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ 2013/n3515.pdf –

Odpowiedz

5

Jeżeli użytkownik stosując impuls, spróbuj BOOST_STRONG_TYPEDEF

przykład z dokumentacją:

BOOST_STRONG_TYPEDEF(int, a) 
void f(int x); // (1) function to handle simple integers 
void f(a x); // (2) special function to handle integers of type a 
int main(){ 
    int x = 1; 
    a y; 
    y = x;  // other operations permitted as a is converted as necessary 
    f(x);  // chooses (1) 
    f(y);  // chooses (2) 
} 
+0

Dzięki. Myślę, że to świetne rozwiązanie. Ale szukałem, czy z nowym standardem C++ 11 można to zrobić bez użycia makr lub klas całkowicie. – Zhen