最新のC++デザインを読んでいて、テンプレートテンプレートパラメーターがどのように機能するかを完全に理解できませんでした。
たとえば、この記事http://www.informit.com/articles/article.aspx?p=376878 に示されているように、タイプとコンテナーのテンプレートパラメーターを使用してスタックを作成できます。
テンプレートスタックのパラメータとしてタイプとコンテナだけを使用すると、次のような問題が発生する可能性があります。
template <typename T, class Cont>
class Stack;
template <typename> class List;
Stack<int, List<int> > aStack1; // OK
Stack<double, List<int> > aStack2; // legal, not OK
Stack<std::string, Deque<char *> > aStack3; // error!
上記のコードでは、スタック要素タイプとコンテナ要素タイプの間で互換性のないタイプであるため、aStack1は問題なく、aStack2とaStack3が問題であることが理解できます。
記事によると、これはテンプレートテンプレートパラメータを使用すると解決できます
template <typename T, template <typename> class Cont>
class Stack;
Stack<int,List> aStack1;
Stack<std::string,Deque> aStack2;
ここでの私の疑問は、Dequeがその要素タイプがstd :: stringまたはList要素タイプがintであることをどのように知ることができるかということです???これはテンプレート引数の推論によって行われますか?
ここでは、タイプTのDequeを作成しています。スタックを次のように定義した場合
template <typename T,template U, template <typename> class Cont>
class Stack;
次に、Stackをどのようにインスタンス化できますか
Stack<std::string,int,Deque> // will this work????