比较 typedef 是同一类型

Compare typedef is same type

提问人:Neil Kirk 提问时间:3/4/2013 更新时间:3/4/2013 访问量:10183

问:

我正在使用 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
}
C++语言

评论

2赞 us2012 3/4/2013
cppreference 的示例实现为 : en.cppreference.com/w/cpp/types/is_samestd::is_same
0赞 Red.Wave 11/16/2023
是什么让你留在恐龙时代?

答:

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 。assertBOOST_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:哎呀。我忘记了 .现在修复它。structstatic_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 看起来相同,但它们引用不同的类型,并被模板标记为类型。如果你想让他们测试相同的,那么问题就会完全改变。