我有一个函数,用于在设置缓冲区时强制执行类型匹配:
void SetUInt8(size_checker<uint8_t> val)
{
// make some static checks
}
通常,它是这样调用的:
// compile error, since you might mean to call the SetUInt() function
int myvar = 10;
SetUInt8(myvar);
// works fine
int8_t myvar = 1;
SetUInt8(myvar);
此调用会导致警告,因为30
被解释为int
:
SetUInt8(30);
但我真的希望这是好的,因为30&lt; 256.理想情况下,我希望调用不必改变,但我想出了以下内容:
template<size_t T>
void SetUInt8()
{
ASSERT(T < 256);
// do other stuff
}
当然可以使用:
SetUInt8<30>();
或者,我可以在调用函数时进行转换:
SetUInt8(uint8_t(30U));
是否有另一种方法可以解决30被转换为int的问题,或者如果它是编译时间常量则检测其实际值?
答案 0 :(得分:2)
我最好的想法是static_cast
给你的模板,静态断言函数:
template<size_t size>
void SetUInt8()
{
BOOST_STATIC_ASSERT(size < 256);
SetUInt8(static_cast<uint8_t>(size));
}
像你一样调用它:SetUInt8<50>();
因为它应该总是被内联,所以没有性能开销,它会进行编译时范围检查。更好的是,如果编译器足够聪明,当值明显适合较小类型的范围时不会发出警告。