提问人:Neil Kirk 提问时间:3/4/2013 更新时间:3/4/2013 访问量:10183
比较 typedef 是同一类型
Compare typedef is same type
问:
我正在使用 C++(不是 11)并使用一些对整数数据类型具有不同类型定义的库。有什么方法可以断言两个 typedef 是同一类型?我自己想出了以下解决方案..安全吗? 谢谢
template<typename T>
struct TypeTest
{
static void Compare(const TypeTest& other) {}
};
typedef unsigned long long UINT64;
typedef unsigned long long UINT_64;
typedef unsigned int UINT_32;
int main()
{
TypeTest<UINT64>::Compare(TypeTest<UINT64>()); // pass
TypeTest<UINT64>::Compare(TypeTest<UINT_64>()); // pass
TypeTest<UINT64>::Compare(TypeTest<UINT_32>()); // fail
}
答:
3赞
ForEveR
3/4/2013
#1
由于您没有 C++11,因此请使用 boost。
BOOST_STATIC_ASSERT(boost::is_same<T, U>::value);
您可以编写某种断言函数,而不是 .BOOST_STATIC_ASSERT
评论
0赞
Michael Wild
3/4/2013
当您已经在使用 boost 时,请将 run-time 替换为 compile-time 。assert
BOOST_STATIC_ASSERT
0赞
ForEveR
3/4/2013
@MichaelWild,assert 真的不是 C assert,它是某种 assert 函数。
2赞
Michael Wild
3/4/2013
这无关紧要。重要的是,OP 可能希望在编译时通过/失败,而不是在运行时。assert
0赞
Neil Kirk
3/4/2013
谢谢你的建议。不幸的是,我不能使用boost。
1赞
Kamouth
3/4/2013
#2
std::type_info 可能会对您有所帮助。
评论
0赞
Kamouth
3/4/2013
@MichaelWild:根据此页面,它不是特定于 c++ 11。我说得对吗?
0赞
Michael Wild
3/4/2013
对不起,我把它和标题混淆了。<type_traits>
29赞
Nawaz
3/4/2013
#3
在 C++11 中,您可以使用 .std::is_same<T,U>::value
由于您没有 C++11,因此您可以自行实现此功能:
template<typename T, typename U>
struct is_same
{
static const bool value = false;
};
template<typename T>
struct is_same<T,T> //specialization
{
static const bool value = true;
};
做!
同样,您可以将 1 实现为:static_assert
template<bool> struct static_assert;
template<> struct static_assert<true> {}; //specialization
现在,您可以将它们用作:
static_assert<is_same<UINT64,UINT64>::value>(); //pass
static_assert<is_same<UINT64,UINT32>::value>(); //fail
或者你可以把它包装在一个宏中,如:
#define STATIC_ASSERT(x) { static_assert<x> static_assert_failed; (void) static_assert_failed; }
然后用作:
STATIC_ASSERT(is_same<UINT64,UINT64>::value); //pass
STATIC_ASSERT(is_same<UINT64,UINT32>::value); //pass
如果使用宏,则在断言失败时,将在编译器生成的消息中看到以下字符串:
static_assert_failed
这很有帮助。使用错误消息中的其他信息,您将能够找出失败的原因。
希望能有所帮助。
1. 请注意,在 C++11 中,static_assert
是一个运算符(在编译时运行),而不是类模板。在上面的代码中,static_assert
是一个类模板。
评论
0赞
Neil Kirk
3/4/2013
你好。我正在 VS2008 上尝试您的解决方案,但行 template<bool> static_assert 给出错误:错误 C4430:缺少类型说明符 - 假定为 int。注意:C++不支持 default-int 错误 C2998:“int static_assert”:不能是模板定义
0赞
Nawaz
3/4/2013
@NeilKirk:哎呀。我忘记了 .现在修复它。struct
static_assert
0赞
Neil Kirk
3/4/2013
假设 UINT32 可以定义为 unsigned int 或 unsigned long int。这些在您的代码中会比较相同吗?谢谢。
0赞
Nawaz
3/4/2013
@NeilKirk:我不明白你在说什么。尝试自己看看,如果您遇到任何问题,请告诉我详细信息。
2赞
David Rodríguez - dribeas
3/4/2013
@NeilKirk:这两种是不同的类型。虽然 typedef 看起来相同,但它们引用不同的类型,并被模板标记为类型。如果你想让他们测试相同的,那么问题就会完全改变。
评论
std::is_same