2014-10-22 68 views
3

我有C++ 11代码失败编译因为重载函数与同类型作为参数重新定义之间的差异:编译宏测试uint64_t中和unsigned long长整型

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 2014-10-22 05:08:44

+0

您是否检查过某些标准库支持以确定typef中的printf说明符? – 2014-10-22 05:20:29

+0

将第二个重载的返回值更改为:enable_if :: value,const typename char *> :: type;这就是@chris所说的 – 2014-10-22 14:37:54

回答

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 

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

+0

这很脆弱,因为在不同的平台中,ULLONG_MAX可能与UINT64_MAX不同。 – 2014-10-22 05:14:56

+1

@RSahu:“可能不同”(或者说,可能是相同的)就是这一点。 – 2014-10-22 05:23:50

+0

@ Cheersandhth.-Alf,如果'unsigned long long int'是'uint128_t'(不知道有没有这样的事情)? '#if'声明必须扩展以照顾这种可能性。 – 2014-10-22 05:28:44