编译器宏用于测试uint64_t和unsigned long long int之间的差异

3

我有一些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"; }

因此,仅检查类型使用了多少内存似乎是不够的。还有其他方法吗?

2
不需要使用SFINAE宏。 - chris
你是否检查过一些标准库来确定 printf 格式说明符的类型支持? - Cheers and hth. - Alf
将第二个重载的返回值更改为:enable_if<is_same<uint64_t,unsigned long long int>::value,const typename char *>::type; 这就是@chris所说的。 - Stefan Atev
1个回答

2
你可以使用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不同。 - R Sahu
1
@RSahu: “可能不同”(或者更确切地说,可能相同)就是重点。 - Cheers and hth. - Alf
@Cheersandhth.-Alf,如果unsigned long long intuint128_t(不确定是否存在这样的类型),那么#if语句必须扩展以处理这种可能性。 - R Sahu
1
@RSahu 他们可能不同的事实,正是原问题的解决之道。如果它们相同,则只定义一个函数;如果它们不同,则定义两个函数。这样做怎么不能解决原始问题呢? - ApproachingDarknessFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接