2016-04-25 3 views
0
著者はこのコードを投稿 this質問から this答えでは

C++:この機能では、キーワード「型名」の意味

template <typename... Ts> 
    typename std::tuple_element<0, std::tuple<Ts...> >::type // or decltype(auto) 
     callFunction(Ts&&... ts) 
    { 
     using type = typename std::tuple_element<0, std::tuple<Ts...> >::type; 
     auto it = multiCache.find(typeid(type)); 
     assert(it != multiCache.end()); 
     auto&& fn = boost::any_cast<const std::function<type(Ts...)>&>(it->second); 
     return fn(std::forward<Ts>(ts)...); 
    } 

typename std::tuple_element<0, std::tuple<Ts...> >::typeの意味は、返される型は、の最初の要素と同じであるということですTs...の最初の要素、右?

+1

はい、これは、貧困層の「型パラメータパックへのインデックス」です。 'T &&、Ts && ...'を使って関数を書くだけで、 'T 'を直接使うかもしれないので、この場合はやや愚かです。 –

答えて

0

いいえ、typenameというキーワードは、実際の意味ではclassと同じ意味です。

少し相違しています。テンプレート関数またはクラスのコンテキストでは、typenameは、正式に宣言されたクラスではなくPODでもかまいません。それは文字通り「どんなタイプ、PODまたはクラス」を意味します。

これは、キーワードtypenameが一般的に意味するものです。この場合、これは特定の目的を持っている:クラスメンバーとは対照的に、

typename std::tuple_element<0, std::tuple<Ts...> >::type 

これはstd::tuple_element<0, std::tuple<Ts...> >で「タイプ」を期待するようコンパイラーに指示しても、class(またはtypedef)になるだろう。あなたが見える何かを持っている場合は

のように:

classname::identifier 

これは、タイプやクラスのメンバーのいずれかを参照することができます:ここでは

class X { 

public: 
    typedef int y; 
    int z; 
}; 

X::yは、タイプを指し、X::zはを参照しますクラスメンバー。テンプレートの構文解析に関しては、C++コンパイラはデフォルトで "A :: b"がクラスメンバーを参照することを前提としていますが、その前にtypenameを貼り付ける必要はありません。タイプ。

+1

Hey Sam。いくつかの考え方: 'typename'と' class'は、 'template 'のテンプレートパラメータをリストするときに同じ意味で使用できます。 * "a typename"は、正式に宣言されたクラスではなく、PODでもかまいません。 "* - これは前の例の' A'と 'B'にも同じです。コンパイラは区別しませんが、行う。クラスメンバ "*/*"がクラスメンバを参照しようとするのに対して、 "* - types /' typedef'はクラスメンバになることができます。クラス* data *メンバと対比する方が良いでしょう。 –

関連する問題