我正在使用C ++(而不是11)并使用一些对整数数据类型具有不同typedef的库。有什么办法可以断言两个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
}
答案 0 :(得分:25)
在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;
};
完成!
同样,您可以将static_assert
1 实现为:
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
是一个类模板。
答案 1 :(得分:3)
由于您没有C ++ 11,请使用boost。
BOOST_STATIC_ASSERT(boost::is_same<T, U>::value);
您可以编写某种断言函数,而不是BOOST_STATIC_ASSERT
。
答案 2 :(得分:1)
std :: type_info可能会对你有帮助。