是否可以创建一个模板化函数来检查原始数据类型是否适合可能不同的原始数据类型的值?我们暂时将范围限制为整数类型.
更确切地说:是否有可能创建一个"一个适合所有"的模板化函数,而不会得到编译器警告(布尔表达式总是真/假,有符号/无符号比较,未使用的变量)并且不禁用编译器警告检查?这些函数还应该在运行时尽可能地限制检查(在编译时应排除所有琐碎的情况).如果可能的话,我宁愿避免使用C++ 11之类的扩展(除非存在"旧"C++的"快速"替代).
注意:"value"在编译时是未知的,只是其类型.
预期行为的示例:
int main(int argc, char** argv) {
for (int i = 1; i < argc; i++) {
const int value = atoi(argv[i]);
std::cout << value << ": ";
std::cout << CanTypeFitValue<int8_t>(value) << " ";
std::cout << CanTypeFitValue<uint8_t>(value) << " ";
std::cout << CanTypeFitValue<int16_t>(value) << " ";
std::cout << CanTypeFitValue<uint16_t>(value) << " ";
std::cout << CanTypeFitValue<int32_t>(value) << " ";
std::cout << CanTypeFitValue<uint32_t>(value) << " ";
std::cout << CanTypeFitValue<int64_t>(value) << " ";
std::cout << CanTypeFitValue<uint64_t>(value) << std::endl;
} …Run Code Online (Sandbox Code Playgroud) 我想将编译时断言添加到以下C++代码中(使用Visual C++ 9编译):
//assumes typedef unsigned char BYTE;
int value = ...;
// Does it fit into BYTE?
if( 0 <= value && value <= UCHAR_MAX ) {
BYTE asByte = static_cast<BYTE>( value );
//proceed with byte
} else {
//proceed with greater values
}
Run Code Online (Sandbox Code Playgroud)
问题是UCHAR_MAX并且BYTE是独立typedef的,当移植此代码时,它们可能会失去同步而代码将会中断.所以我想做这样的事情:
compileTimeAssert( sizeof( BYTE ) == sizeof( UCHAR_MAX ) );
Run Code Online (Sandbox Code Playgroud)
但VC++ 9在编译时会产生"负下标"错误 - sizeof( UCHAR_MAX )恰好是4,而不是1.
如何实现我想要的编译时检查?