是否可以为模板化类型专门化模板?

时间:2012-07-30 13:29:52

标签: c++ templates template-specialization

对于我的程序,我需要定义一个 Solver 类,它可以解决问题或嵌套问题。

template< typename ProblemT >
struct Solver {
    static void a() {
        ProblemT::func();
    }
};

template< typename < typename SubT> ProblemT >
struct Solver<ProblemT< SubT> > {
    static void a() {
        ProblemT::func();
        SubT::func();
    }
};

用法:

Solver<Problem1> solver;
Solver<Problem2<Problem3> > nested_solver;

Solver 的专用版本中,我需要知道 ProblemT SubT 类型,以便正确定义类型并调用正确的功能

是否只是一个简单的错误或是否无法定义这样的类?

2 个答案:

答案 0 :(得分:5)

您可以使用模板模板参数执行此操作:

template<template <typename> class ProblemT, typename SubT>
struct Solver<ProblemT<SubT>>
{
    ...
};

// And you use it like this
Solver<ProblemTemplate<SubProblem>> solver;

答案 1 :(得分:3)

您可以尝试这样的事情:

template <typename T>
struct Solver
{
    static void solve() { T::func(); }
};

template <template <typename> class Tmpl, typename U>
struct Solver<Tmpl<U>>
{
    static void solve() { Tmpl<U>::solve(); }
};

显然,您可以使用您可以在专业化等中访问的其他成员函数来装饰您的主要Solver模板。