2011-01-10 12 views
2

Iは、次ている:専門とテンプレートテンプレートパラメータ

template <template <typename, typename> class C, class T, class A > 
class TTCTest 
{ 
public: 
     TTCTest(C<T, A> parameter) { /* ... some stuff... */ } 
     C<T, A> _collection; 
}; 

IはTとクラスは、特定のタイプ(それぞれのパスとアロケータ)である場合、テンプレートのみインスタンス化されていることを確認します。例えば

... 
list<path, allocator<path> > list1; 
list<int, allocator<int> > list2; 

TTCTest<list> testvar(list1); // ...should work 
TTCTest<list> testvar(list2); // ...should not work 
... 

は、これは可能であり、構文は何ですか?

よろしく、 コル

+0

少なくとも、(エディタのツールバーを使用)してくださいだけでなく、タイトルを書いて、あなたは簡単に読めるようにしてコードをフォーマットすることができます。 – bluish

+0

申し訳ありません - 次回はこれを必ず実行します。 – ColB

+0

CとTが常にパスとアロケータでなければならない場合、なぜそれらがテンプレートパラメータであるべきですか? – stijn

答えて

2
:あなたはあなたが必要な場合がありますすべては、それは次のようになり、その場合には部分的な特殊であることを、後に示されたので :

template<class T, class A> class path {}; 
template<class T, class A> class not_path {}; 

template<class T> class allocation {}; 

template<class T> 
struct Testable; 

template<class T, class A> 
struct Testable<path<T,A> > {}; 

template <template <typename, typename> class C, 
class T, class A > 
class TTCTest 
{ 
public: 
     TTCTest(C<T, A> parameter, Testable<C<T,A> > = Testable<C<T,A> >()); 
     C<T, A> _collection; 
}; 

void foo() 
{ 
    path<int, allocation<int> > p; 
    TTCTest<path, int, allocation<int> > t(p); // compiles 

    not_path<int, allocation<int> > np; 
    TTCTest<not_path, int, allocation<int> > t1(np); // fails 
} 

編集:例えば、唯一pathタイプのおTTCTestの建設を制限します

これは、特殊化されていないケースの実装を提供していない部分的な特殊化で行うことができます。たとえば

template <template <typename, typename> class C, class T, class A > 
class TTCTest; 

template <template <typename, typename> class C> 
class TTCTest<C, path, allocator<path> > 
{ 
    // ... 
}; 
+0

Bartに感謝します。これは私が達成しようとしているものです。残念なことに、その構文はVS2005で失敗します。 :-( – ColB

+0

私は悪い!私の間違い - それは確かに動作します。 – ColB

0

あなたはインスタンス化を制約する形質クラスを作成することができます。

template <class T, class A > 
class TTCTest<path, T, A> 
{ 
public: 
     TTCTest(path<T, A> parameter); 
     path<T, A> _collection; 
}; 
関連する問題