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它,尽管您是否应该首先这样做是另一锅鱼:
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。