【发布时间】:2021-02-05 11:37:11
【问题描述】:
我正在寻找一种方法来检测 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 within constexpr function?
但是我不能使用throw,因为我在gcc没有启用异常的avr嵌入式目标上,即使它在这里用于编译时检查。
知道如何在编译时检测compare 的值没有超过给定值吗?
【问题讨论】:
-
你可以做一些违法的事情吗?也许
reinterpret_cast或取消引用一个nullptr? -
@user975989:在编译时应该如何检测?
-
为什么不
Timer0Impl<800000, 10> t0?无论如何,它总是编译时间,对吧? -
您将
constexpr函数与其值在编译时未知的参数一起使用。是故意的吗? -
if(!condition) *(int*)(nullptr)?我现在意识到你正在使用C++20,所以你可以使用consteval。
标签: c++ avr c++20 static-assert