假设我对所有标准整数类型都有函数重载:
void foo( char ); void foo( signed char ); void foo( short ); void foo( int ); void foo( long ); void foo( long long ); // .... all unsigned variants as well
是否有可能这些重载无法找到类似int8_t
或类似的类型的适当重载?有可行的方法来处理这种过载吗?
参考怎么样?
澄清问题:它来自对这个问题的讨论为什么int8_t被读作一个字符?并声称可能存在编译器生成的整数类型,它们不是基本C++类型的别名.所以在这种情况下,所有基本情况的重载都可能不接受它.另一方面,我无法提供重载,int8_t
因为在许多平台上它只是一个别名,并且会因重新定义现有的重载而出错.
该标准不保证标准整数类型是编译器支持的唯一整数类型.实际上,C和C++标准明确允许编译器定义其他整数类型,统称为"扩展整数类型":
也可能存在实现定义的扩展有符号整数类型.
同样,对于每个扩展的有符号整数类型,都存在相应的扩展无符号整数类型 ......
扩展有符号整数类型和扩展无符号整数类型统称为扩展整数类型.
并且C标准不禁止实现使用扩展整数类型来实现stdint.h
类型.甚至有这种非规范的符号,只是为了说清楚:
其中一些类型可能表示实现定义的扩展整数类型.
如果你想要一个可以采用任何整数类型的函数,你有两个选择:使它成为一个模板(可能使用SFINAE来禁止非整数类型)或提供一个单一的重载std::intmax_t
.标准要求intmax_t
是支持的最大整数:
指定一个有符号整数类型,能够表示任何有符号整数类型的任何值
当然,"有符号整数类型"包括标准和扩展类型.因此std::intmax_t
可以处理实现支持的任何有符号整数.