有没有办法制作一个类型的完整副本,以便在模板推导上下文中区分它们?举个例子:
#include <iostream>
template <typename T>
struct test
{
static int c()
{
static int t = 0;
return t++;
}
};
typedef int handle;
int main()
{
std::cout << test<int>::c() << std::endl;
std::cout << test<handle>::c() << std::endl;
return 0;
}
由于typedef只为类型创建别名,因此会输出0,1 而不是所需的0,0。有没有解决方法呢?
答案 0 :(得分:8)
请注意既不是typedef也不是使用create new distinct数据类型。 它们只创建现有类型的同义词。这意味着类型 上面的myword,用WORD类型声明,也可以考虑 type unsigned int;它实际上并不重要,因为两者都是 指同一类型。
由于int
和handle
是同一个,因此预计会输出0 1
。
正如@interjay建议的那样,有一种解决方法。
您可以使用BOOST_STRONG_TYPEDEF
。
BOOST_STRONG_TYPEDEF( int , handle );
答案 1 :(得分:3)
建议使用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;
}
输出:0 0,因为句柄不是 int,而是一种可隐式转换为int的类型。
如果您不想使用BOOST_STRONG_TYPE,则只需添加第二个参数 到你的班级模板:
template<typename, unsigned int N>
struct test {
static int c() {
static int t = 0;
return t++ ;
}
};
从而使test<int, 0>
和test<handle, 1>
成为不同的类型
int main() {
std::cout << test<int, 0>::c() << std::endl ;
std::cout << test<handle,1>::c() << std::endl ;
return 0;
}
输出:0 0
您还可以添加宏来生成类型:
#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;
}