C ++检测传入函数的const int

时间:2011-05-26 18:29:55

标签: c++ templates casting

我有一个函数,用于在设置缓冲区时强制执行类型匹配:

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的问题,或者如果它是编译时间常量则检测其实际值?

1 个答案:

答案 0 :(得分:2)

我最好的想法是static_cast给你的模板,静态断言函数:

template<size_t size>
void SetUInt8()
{
    BOOST_STATIC_ASSERT(size < 256);
    SetUInt8(static_cast<uint8_t>(size));
}

像你一样调用它:SetUInt8<50>();

因为它应该总是被内联,所以没有性能开销,它会进行编译时范围检查。更好的是,如果编译器足够聪明,当值明显适合较小类型的范围时不会发出警告。