比较typedef是同一类型

时间:2013-03-04 11:30:15

标签: c++

我正在使用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
}

3 个答案:

答案 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可能会对你有帮助。