问题描述
|
我有一个函数,用于设置缓冲区时用于强制类型匹配:
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);
此调用引起警告,因为an2被解释为int
:
SetUInt8(30);
但是我真的希望从30 <256开始就可以。在理想情况下,我希望调用不必更改,但是我想出了以下几点:
template<size_t T>
void SetUInt8()
{
ASSERT(T < 256);
// do other stuff
}
当然会使用哪种方式:
SetUInt8<30>();
另外,我可以在调用函数时进行强制转换:
SetUInt8(uint8_t(30U));
关于将30转换为int或如果其编译时间常数检测其实际值的问题,是否还有另一种方法?
解决方法
我最好的想法是为您提供function8ѭ的模板,静态声明的函数:
template<size_t size>
void SetUInt8()
{
BOOST_STATIC_ASSERT(size < 256);
SetUInt8(static_cast<uint8_t>(size));
}
像你一样叫它:SetUInt8<50>();
由于希望总是内联它,因此没有性能开销,并且可以进行编译时范围检查。更好的情况是,如果编译器足够聪明,当值明显适合较小类型的范围时不发出警告。