将类模板与默认模板参数匹配为具有较少参数的模板参数

时间:2014-06-16 13:15:28

标签: c++ templates

我有一堆看起来像这样的模板:

template <class Graph>
class LinearSolver_A { /* ... */ };

template <class Graph, class Optional1 = int, class Optional2 = double>
class LinearSolver_B { /* ... */ };

现在,我有另一个模板,它希望这些解算器作为参数:

template <template <class> class LinSolver>
class SolverRunner { /* ... */ };

struct solver_not_compiled_t {}; // just a simple structure

template <>
class SolverRunner<solver_not_compiled_t> { /* ... */ };
// there is also a specialization of SolverRunner, in case it matters

我的问题是,只有具有单个模板参数的线性求解器(例如LinearSolver_A)才能与SolverRunner的参数匹配。但是,如果有任何可选参数(如LinearSolver_B),即使提供了默认值,也无法匹配它们。

我认为typename无法使用,因为模板不是完整类型。怎么解决这个问题?我会接受一个包装器的解决方案,但包装器本身需要是一个模板,我们回到同样的问题。我想这可以通过为每个LinearSolver_?编写一个不同类型的包装器来解决,但这要么是大量的复制粘贴还是一些预处理器的魔术 - 是否真的没有办法以干净的C ++方式执行此操作?

这类似于Why the template with default template arguments can't be used as template with less template argument in Template Template Parameters,除非作者没有要求解决方案 - 我真的想使用这些模板。

可悲的是,没有C ++ 11。

1 个答案:

答案 0 :(得分:3)

如果您使用的是C ++ 11,则可以使用template aliases

template <class Graph>
using LinearSolver_B_Defaults = LinearSolver_B<Graph>;

template <>
class SolverRunner<LinearSolver_B_Defaults> { /* ... */ };

编辑:由于您无法使用此功能,您可以执行以下操作:

template <class Graph, class Optional1 = int, class Optional2 = double>
class LinearSolver_B { /* ... */ };

template <class Graph>
struct LinearSolver_B_Applier
{
    typedef LinearSolver_B<Graph> type;
};

template <>
class SolverRunner<LinearSolver_B_Applier>
{
    // Use typename LinearSolver_B_Applier<T>::type inside here.
};