在类函数使用的全局模板中使用#ifdef

时间:2018-04-12 00:10:39

标签: c++ templates macros conditional-compilation

我有一个全局模板

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应该在括号之前。我怎样才能完成这项工作?

0 个答案:

没有答案