2016-11-19 11 views
0

いくつかのいずれかが正確に次のコードこれらのテンプレート引数はどのように解釈され使用されますか?

template <template <typename, typename...> class Holder, typename retType,typename... T> 
    class EventListener<Holder<retType(T...)>> 
    { 
     friend class Holder<retType(T...)>; 
     typedef Holder<retType(T...)> HolderType; 
     private: 
     HolderType* _Holder; 
    } 

で何が起こっているのか私に説明してくださいすることができます私はちょうどretTypeとTの両方が型名あり、まさにホルダーで述べたことを知っていただきたいと思います。どのようにretType(T ...)が定義されたか...?

+0

'retType(T ...)'は 'retType'を返し、' T'のパックをとる関数型です。例: 'int(bool、char、int)'または 'void()' – 0x499602D2

答えて

0

テンプレート引数

template <typename, typename...> class Holder 

テンプレートテンプレート引数です。つまり、テンプレート引数は、単一の型の上でパラメータ化できるクラステンプレートであり、その後にテンプレート型の引数のリストが続く必要があります。あなたは

template <typename, typename... Args> class ImAVariadicTemplate { 
    // ... 
}; 

のようなテンプレートを持っている場合たとえば、あなたはImAVariadicTemplateに渡すことで、最初のテンプレート引数をインスタンス化できます。

次のビット、retType(T...)、「戻りタイプretTypeと引数型がパラメータパックTで与えられたタイプのリストで指定されている機能の種類を意味する。例えば、retTypeintTであればありますリストdouble, float, shortの場合は、タイプint(double, float, short)に、タイプはdoublefloatshortになり、intが返されます(ここでの構文はかなり混乱します。関数のタイプについて実際に話しているときは、retTypeという関数を呼び出します)

一緒にこれらを置く、構文

Holder<retType(T...)> 

は「タイプとしてタイプTにタイプのリストで与えられる一連の引数に取る関数の型を使用してHolderテンプレートをインスタンス化を意味し、 retTypeを返します。 " :-)

関連する問題