У меня есть функция, которую мы используем для обеспечения соответствия типов при установке в буфер:
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 <256. В идеале, я бы хотел, чтобы вызов не менялся, ноЯ придумал следующее: </p>
template<size_t T>
void SetUInt8()
{
ASSERT(T < 256);
// do other stuff
}
Что, конечно, будет использоваться как:
SetUInt8<30>();
Кроме того, я могу разыграть при вызове функции:
SetUInt8(uint8_t(30U));
Есть ли другой способ обойти проблему преобразования 30 в целое число или определения его действительного значения, если это постоянная времени компиляции?