我正在尝试编写一个函数,如果使用编译时常量参数调用,如果参数的值与static_assert
,但仍然可以在运行时使用计算值进行调用。
有点像这样:
template<int N> void f(N){
static_assert(N == 5, "N can only be 5.");
do_something_with(N);
}
void f(int N){
if(N == 5){
do_something_with(N);
}
}
volatile int five = 5;
volatile int six = 6;
int main() {
f(5); //ok
f(6); //compile-time error
f(five); //ok
f(six); //run-time abort
return 0;
}
我怎样才能做到这一点?
另外,如果可能的话,我希望能够保持简单f(something)
语法,因为此代码适用于不熟悉模板语法的初学者程序员应该可以使用的库。
我能想象的最好的是constexpr
抛出异常的函数。
如果在编译时执行,throw
导致编译错误;如果在运行时执行,则抛出异常
就像是
#include <stdexcept>
constexpr int checkGreaterThanZero (int val)
{ return val > 0 ? val : throw std::domain_error("!"); }
int main()
{
// constexpr int ic { checkGreaterThanZero(-1) }; // compile error
int ir { checkGreaterThanZero(-1) }; // runtime error
}
- 编辑 -
正如 yuri kilocheck 所指出的,您可以调用而不是抛出异常std::abort()
;举例来说
constexpr int checkGreaterThanZero (int val)
{ return val > 0 ? val : (std::abort(), 0); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)