2

テンプレート タイプをテンプレート タイプにする必要があります。

template < template < int beta, typename gamma> class alpha >
gamma foo()
{
    // do stuff with beta, gamma
    gamma c[beta]; 
    alpha a();
    alpha b();
}

与えた値によってガンマとベータを決定したいので、次のようにします。

foo< hello<2,double> >()

hello<2,double>の代わりにオブジェクトを作成し、2 つの要素を持つの配列になりalphaます。cdouble

したがって、foo に渡されたテンプレート化されたクラスからテンプレート パラメーターを抽出したいと考えています。

どうすればいいですか?

4

1 に答える 1

4

指定したテンプレート宣言は、いわゆるtemplate-templateパラメーター(テンプレートタイプのテンプレートパラメーター)を取ります。ただし、提供した使用例では、「通常の」クラスを引数として渡そうとします(すべてのテンプレートパラメーターが修正されると、テンプレートクラスは「通常の」クラスに変わり、テンプレートではなくなります)。

これはすぐに、template-templateパラメーターが必要なものではないことを意味します。テンプレート-テンプレートパラメータは、まったく異なる目的を果たします。(ここでは詳しく説明しません)。

問題の1つの可能な解決策は、ネストされた型と定数を介してテンプレート引数を公開するように引数クラスに要求することです。つまり、helloテンプレートにはネストされた定数beta_valueとネストされたタイプ名が含まれている必要がありますgamma_type

template <int BETA, typename GAMMA> class hello 
{
public:
  static const int beta_value = BETA;
  typedef GAMMA gamma_type;
  ...
};

この場合、関数は通常の型テンプレートパラメータで宣言されます

template <typename ALPHA> typename ALPHA::gamma_type foo()
{
   // do stuff with beta, gamma
   typename ALPHA::gamma_type c[ALPHA::beta_value]; 
   ALPHA a();
   ALPHA b();
}

一部のユーザーが規則に従うのを忘れた場合、コンパイラーはコンパイルを拒否し、fooそのユーザーに引数クラスの定義を更新するように強制します。

于 2012-07-03T05:00:29.480 に答える