【问题标题】:Compiler macro to test difference between uint64_t and unsigned long long int用于测试 uint64_t 和 unsigned long long int 之间差异的编译器宏
【发布时间】:2014-12-17 11:58:59
【问题描述】:

我的 C++11 代码无法编译,因为重载函数被重新定义为与参数相同的类型:

char const* foo(uint64_t) { return "%" PRIu64; }
char const* foo(unsigned long long int) { return "%llu"; }

是否可以添加一个编译器宏来检查这两个原语之间的相等性,然后在编译之前删除第二个(如果相等)?

还有其他函数可以返回其他类型的字符指针。例如,添加它不会给我带来任何麻烦,即使 signedunsigned long long int 使用相同的字节数:

char const* foo(long long int) { return "%lld"; }

所以检查一个类型使用了多少内存似乎是不够的。还有什么其他方法?

【问题讨论】:

  • SFINAE 不需要宏。
  • 您是否检查过一些标准库支持从类型确定 printf 说明符?
  • 将第二个重载的返回值改为:enable_if::value, const typename char *>::type;这就是@chris 所说的

标签: c++ c++11 macros uint64 unsigned-long-long-int


【解决方案1】:

您可以使用climitscstdint 中的定义检查这些类型的最大值:

#include <climits>
#include <cstdint>

char const* foo(uint64_t) { return "%" PRIu64; }

//ULLONG_MAX defined in climits, UINT64_MAX in cstdint
#if ULLONG_MAX != UINT64_MAX

char const* foo(unsigned long long int) { return "%llu"; }

#endif

然而,使用模板创建系统可能是一个更好的长期解决方案。

【讨论】:

  • 这很脆弱,因为 ULLONG_MAX 在不同的平台上可能与 UINT64_MAX 不同。
  • @RSahu:“可能不同”(或者更确切地说,可能相同)才是重点。
  • @Cheersandhth.-Alf,如果unsigned long long intuint128_t(不确定是否有这样的事情)怎么办?必须扩展 #if 语句以处理这种可能性。
  • @RSahu 他们可能不同的事实不是这个答案而是原始问题的重点。如果它们相同,则只定义一个函数;如果它们不同,则定义两个函数。这怎么不能解决原来的问题?
猜你喜欢
  • 2016-07-29
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多