我有一个全局模板
template <typename Derived>
double my_function(const MatrixBase<Derived>& m) {
return m.determinant();
}
我希望能够通过编译器标志更改my_function
。例如:
template <typename Derived>
double my_function(const MatrixBase<Derived>& m) {
#ifdef NODET
return 0;
#else
return m.determinant();
#endif
}
如果我现在在任何类函数中使用my_function
,我会收到错误:
error: there are no arguments to ‘my_function’ that depend on a template parameter, so a declaration of ‘my_function’ must be available [-fpermissive]
我想我可以通过将my_function
移动到调用它的类中来解决此错误。但是,我的代码中的其他几个函数和类使用此模板,因此将它移动到任何一个类都会有问题。
我在SO和其他网页上看到了一些警告:如果有其他解决方法,则不应使用#ifdef
个宏。我想继续使用它,因为我想确保if-else语句在编译时完全解析。每次运行我的代码都会调用my_function
几十亿次,所以我也不想在my_function
中添加任何中间变量,关键字参数或if-else子句,这些子句甚至可能比它稍慢一些目前是。
我怎样才能让它发挥作用?或者,如何在不使用宏的情况下实现我想要的目标?
修改的
在回应彼得的评论时,我尝试了以下
template <typename Derived>
double my_function(const MatrixBase<Derived>& m) {
if constexpr (NODET) {
return 0;
}
else {
return m.determinant();
}
}
使用gcc和C ++ 17编译时会抛出错误:
error: expected ‘(’ before ‘constexpr’
if constexpr (NODET)
但根据cppreference,constexpr应该在括号之前。我怎样才能完成这项工作?