我有一堆看起来像这样的模板:
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。
答案 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.
};