9

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

3 回答 3

27

在 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_assert1实现为:

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

于 2013-03-04T11:39:13.910 回答
3

由于您没有 C++11,请使用 boost。

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

您可以编写某种断言函数,而不是BOOST_STATIC_ASSERT.

于 2013-03-04T11:34:02.330 回答
1

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

于 2013-03-04T11:37:02.407 回答