Sia come suggerito BOOST_STRONG_TYPEDEF
template<typename>
struct test {
static int c() {
static int t = 0;
return t++ ;
}
};
//Instead of
//typedef int handle
BOOST_STRONG_TYPEDEF(int , handle) ;
int main() {
std::cout << test<int>::c() << std::endl
std::cout << test<handle>::c() << std::endl ;
return 0;
}
uscita: 0 0, perché la maniglia è non int, ma un tipo implicitamente convertibile in int.
se non si desidera utilizzare BOOST_STRONG_TYPE poi semplicemente aggiungere secondo parametro al vostro modello di classe: fare
template<typename, unsigned int N>
struct test {
static int c() {
static int t = 0;
return t++ ;
}
};
Così test<int, 0>
e test<handle, 1>
tipi diversi
int main() {
std::cout << test<int, 0>::c() << std::endl ;
std::cout << test<handle,1>::c() << std::endl ;
return 0;
}
uscita: 0 0
È anche possibile aggiungere macro per generare i tipi:
#define DEFINE_TEST_TYPE(type) \
typedef test<type, __COUNTER__> test_##type;
template<typename, unsigned int N>
struct test {
static int c() {
static int t = 0;
return t++ ;
}
};
typedef int handle ;
DEFINE_TEST_TYPE(int) ;
DEFINE_TEST_TYPE(handle) ;
int main() {
std::cout << test_int::c() << std::endl ;
std::cout << test_handle::c() << std::endl ;
return 0;
}
fonte
2015-04-11 00:08:12
Dai un'occhiata a [Boost strong typedef] (http://www.boost.org/doc/libs/1_57_0/libs/serialization/doc/strong_typedef.html). – interjay