2

最新の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????
4

2 に答える 2

4

ここでの私の疑問は、要素の型が std::string であるか、リストの要素の型が int であるかを Deque がどのように知ることができるかということです???これはテンプレート引数推定によって行われますか?

Stackいいえ、次のように実装される可能性が高い実装でクラス テンプレートを明示的にインスタンス化します。

template <typename T, template <typename> class Cont>
class Stack
{
  Cont<T> _container; //here you use `T` as template argument to `Cont`

  Cont<int> _ints; //you can do even this if you need a containter of int.
                   //though in this case you don't need this.

  public:
        void push(T const & data)
        {
           _container.push_back(data); 
        }
        //etc
};
于 2013-01-02T11:03:58.297 に答える
0

テンプレートをインスタンス化するには、その定義が必要です。あなたの例では、テンプレート宣言のみを提供していますが、インスタンス化するには不十分です。定義は、テンプレート パラメーターの使用方法を詳述する実装を提供します。例えば、

template <typename T, template <typename> class Cont>
class Stack : Cont<T>
{
   typedef Cont<T> my_container;
 public:
   using my_container::push_back;
   /* more details here */ 
};

Stack<int,List> aStack1;
Stack<std::string,Deque> aStack2;

から派生したものとして実装aStack1し、 a から派生したものとしてList<int>実装astack2Deque<std::string>ます。

于 2013-01-02T11:04:32.050 に答える