1

私のプログラムでは、問題またはネストされた問題を解決できる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の特殊化されたバージョンでは、型を正しく定義して正しい関数を呼び出すために、ProblemTSubTの両方の型を知る必要があります。

単純なエラーですか、それともそのようなクラスを定義することは不可能ですか?

4

2 に答える 2

5

これは、テンプレート テンプレート パラメーターを使用して行うことができます。

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

// And you use it like this
Solver<ProblemTemplate<SubProblem>> solver;
于 2012-07-30T13:34:09.767 に答える
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などでアクセスできる追加のメンバー関数を使用して、プライマリテンプレートを装飾することができます。

于 2012-07-30T13:50:23.183 に答える