2013-04-11 6 views
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

が原因テンプレート引数の数が間違っの動作しません。 PolicyTwoPOLICYテンプレートパラメータとして使用する方法はありますか?追加テンプレートパラメータのタイプを指定する場合は、

私はC++ 03を使用しているので、エイリアス宣言は利用できません。 私はthis questionを認識していますが、そこに私の問題の解決策はありません。

答えて

3

、あなたはエイリアステンプレートの代わりに継承して管理することができる場合があります

template<int U, int V> struct PolicyTwoAdaptor { 
    template<class T> struct type: PolicyTwo<T, U, V> { }; }; 
C<int, PolicyTwoAdaptor<1, 2>::type> mc2; 
0

私はあなたの現在の仕組みでこれを解決するためにHWO見ることはできませんが、あなたはそれが機能する方法を逆にすることができますし、それがうまくコンパイルする必要があります(とさえクラステンプレートパラメータを除去することにより、複雑さを低減することができる):

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 
} 

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

+0

それは私が宣言することはできませんので、このソリューションは、私のために動作しません。 'T'とは独立して動作する' POLICY'のデフォルト値です。 –

+0

@Gabriel Schreiberあなたのポリシーはテンプレートタイプのパラメータを無視して(そのタイプを公開しています)、単に 'T'とは独立して動作します。 –

関連する問題