根据模板参数更改member-typedef?

goo*_*ons 6 c++ templates c-preprocessor

我这里有这个问题,我无法弄清楚如何解决.我想要一个模板类,它接受一个整数作为模板参数,并相应地设置另一个类的模板参数:

template <int T>
class Solver
{

  public:

    #if T <= 24
      typedef MyMatrix<float> Matrix;
    #else if T <= 53
      typedef MyMatrix<double> Matrix;
    #else
      typedef MyMatrix<mpreal> Matrix;
    #endif

    Matrix create();

};
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

Solver<53>::Matrix m = Solver<53>::create();
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?目前使用上面的代码,编译器抱怨它不知道"Matrix",所以我不确定你是否可以在模板参数上使用预处理器.

Fil*_*efp 11

介绍

由于您希望S<N>::Matrix根据传递的N而产生不同的类型,因此您需要使用某种元模板编程.该问题目前使用预处理程序进行标记,并且代码段显式尝试使用它; 但在这种情况下,这几乎没用.

当代码被预处理时N只不过是一个名字,它没有一个值; 然而.


描述中提到if,else ...... else,else ; 我们正在处理类型..通过<type_traits>它看起来似乎std::conditional是一个完美的匹配!

std::conditional<condition, type-if-true, type-if-false>::type;
Run Code Online (Sandbox Code Playgroud)

:根据在是否找到了表达condition的产量假的,::type将是一个类型定义 为两种类型,如果为真,或者类型,如果假.


我们来写一个示例实现:

#include <type_traits>
Run Code Online (Sandbox Code Playgroud)

template <int N>
class Solver
{
  public:
    typedef typename std::conditional<
      /*    */ (N <= 24),
      /* y? */ MyMatrix<float>,
      /* n? */ typename std::conditional<(N <= 53), MyMatrix<double>, MyMatrix<mpreal>>::type
    >::type matrix_type;

  ...
};
Run Code Online (Sandbox Code Playgroud)

int main () {
  Solver<53>::matrix_type a; // Matrix<double>
  Solver<10>::matrix_type b; // Matrix<float>
  Solver<99>::matrix_type c; // Matrix<mpreal>
}
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 今天学习了`std :: conditional`. (4认同)

use*_*267 5

您可以使用std::conditional它,尽管您是否应该首先这样做是另一锅鱼:

template<int T>
class Solver
{
  std::conditional_t<
    T <= 24,
    MyMatrix<float>,
    std::conditional_t<
      T <= 53,
      MyMatrix<double>,
      MyMatrix<mpreal>
    >
  > Matrix;
};
Run Code Online (Sandbox Code Playgroud)

如果您的编译器不支持它,您将需要使用std::conditionaland::type而不是conditional_t