比较typedef是相同的类型

Compare typedef is same type

本文关键字:类型 typedef 比较      更新时间:2023-10-16

我正在使用c++(不是11)并使用一些对整数数据类型有不同类型定义的库。有什么方法可以断言两个类型是相同的类型吗?我自己想出了下面的解决办法。安全吗?由于

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
}

在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; }

则使用as:

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是一个类模板

由于您没有c++ 11,所以请使用boost。

BOOST_STATIC_ASSERT(boost::is_same<T, U>::value);

你可以写一些你的断言函数,而不是BOOST_STATIC_ASSERT

std::type_info可能对您有所帮助。