C ++ обнаружение const int передается в функцию - PullRequest
1 голос
/ 26 мая 2011

У меня есть функция, которую мы используем для обеспечения соответствия типов при установке в буфер:

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 в целое число или определения его действительного значения, если это постоянная времени компиляции?

1 Ответ

2 голосов
/ 26 мая 2011

Лучшая мысль, которую я имею, - это шаблон, статически утвержденная функция, которая static_cast s для вас:

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

Назовите его так, как вы: SetUInt8<50>();

Так какНадеемся, что всегда следует указывать, что производительность не снижается, и выполняется проверка диапазона времени компиляции.Лучше было бы, если бы компилятор был достаточно умен, чтобы не предупреждать, когда значение явно вписывается в диапазон меньшего типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...