Я ищу метод, чтобы определить, что заданное значение конструктора constexpr находится в допустимом диапазоне.
Код выглядит следующим образом:
class Timer0 {
constexpr uint16_t CalcPresecaler( uint32_t faktor )
{
uint16_t prescaler = faktor / 255;
if ( prescaler < 1 ) return 1;
if ( prescaler < 8 ) return 8;
if ( prescaler < 64 ) return 64;
if ( prescaler < 256 ) return 256;
return 1024;
}
constexpr uint8_t PrescalerBits( uint16_t prescaler )
{
if ( prescaler == 1024 ) return 0b101;
if ( prescaler == 256 ) return 0b100;
if ( prescaler == 64 ) return 0b011;
if ( prescaler == 8 ) return 0b010;
if ( prescaler == 1 ) return 0b001;
return 0b000; // should never happen
}
constexpr Timer0( const uint32_t sysclk, const uint32_t timerclk )
{
uint32_t faktor = sysclk/timerclk;
uint16_t prescaler = CalcPresecaler( faktor );
uint8_t prescalerBits = PrescalerBits( prescaler );
uint8_t compare = (faktor/prescaler)-1;
static_assert( ???? ); << can not be used on function parameters
OCR0=compare;
TCCR0=0x08| prescalerBits;
TIMSK=0x02;
}
};
int main()
{
Timer0 t0( 8000000, 10 );
}
Я уже прочитал C++11 - static_assert внутри функции constexpr?, но я могу не используйте throw
, так как я нахожусь на встроенной цели avr, где gcc не включает исключения, даже если он используется здесь для проверки времени компиляции.
Любая идея, как определить во время компиляции, что значение compare
не превышает заданное значение?
reinterpret_cast
или разыменование nullptr? - person user975989   schedule 05.02.2021Timer0Impl<800000, 10> t0
? В любом случае, это всегда будет время компиляции, верно? - person KamilCuk   schedule 05.02.2021constexpr
с параметрами, значения которых неизвестны во время компиляции. Это намеренно? - person vahancho   schedule 05.02.2021if(!condition) *(int*)(nullptr)
? Теперь я понимаю, что вы используетеC++20
, так что вы можете просто использоватьconsteval
. - person user975989   schedule 05.02.2021OCR0
и т. д.? - person user975989   schedule 05.02.2021const uint32_t sysclk
иconst uint32_t timerclk
во время компиляции? - person vahancho   schedule 05.02.2021assert
? Он также создает ошибку времени компиляции, если используется в контексте constexpr. - person n314159   schedule 05.02.2021