5

テンプレート テンプレート パラメータを介して設定されたポリシーと 2 つのポリシー定義を持つテンプレート クラス C を考えてみましょう。

template<class T> struct PolicyOne { };
template<class T, int U, int V> struct PolicyTwo { };
template<class T, template<class> class POLICY> struct C { POLICY<T> policy; };

void f()
{
    C<int, PolicyOne> mc1;
    C<int, PolicyTwo<1, 2> > mc2; // doesn't work this way
}

PolicyTwoテンプレート引数の数が間違っているため、機能しません。追加のテンプレート パラメーターの型を指定する場合、テンプレート パラメーターPolicyTwoとして使用する方法はありますか?POLICY

C++03 を使用しているため、エイリアス宣言は使用できません。この質問は承知していますが、問題の解決策が見当たりません。

4

2 に答える 2

3

ポリシーの使用方法によっては、エイリアス テンプレートの代わりに継承を使用して管理できる場合があります。

template<int U, int V> struct PolicyTwoAdaptor {
  template<class T> struct type: PolicyTwo<T, U, V> { }; };
C<int, PolicyTwoAdaptor<1, 2>::type> mc2;
于 2013-04-11T16:01:10.270 に答える
0

現在のメカニズムでこれを解決する方法はわかりませんが、動作方法を逆にすることができ、正常にコンパイルされるはずです (さらに、クラス テンプレート パラメーターを削除することで複雑さを軽減することもできます)。

template <typename T> struct PolicyBase { typedef T value_type; };
template<class T> struct PolicyOne : public PolicyBase<T> { };
template<class T, int U, int V> struct PolicyTwo : public PolicyBase<T> { };
template<class POLICY> struct C { POLICY policy; typedef typename POLICY::value_type T; };

void f()
{
    C<PolicyOne<int> > mc1;
    C<PolicyTwo<int, 1, 2> > mc2; // doesn't work this way
}

基本的な考え方は、type tempalte パラメーターをポリシー ユーザーから移動し、代わりに完全にインスタンス化されたポリシーを与えることです。次に、ポリシーはそのテンプレート タイプを typedef を介してポリシー ユーザーに返します (必要な場合)。

于 2013-04-11T15:20:09.583 に答える