template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
Johannes Schaub のブログからこのコードを取り上げました。2 番目のテンプレート パラメーターに使用される構文は見たことがありません。どういう"Tag::type M"
意味ですか?
コンパイル時の定数である限り、非型のテンプレート パラメーターを使用できます。つまり、次のようなものを持つことができます
template <int M> ...
ここで、非型テンプレート引数の型を別のテンプレート引数のネストされた型に依存させることが合理的かもしれません:
template <typename T, typename T::type M> ...
パーツは、が型であり、指定されたテンプレート引数がこの型であるとtypename T::type
述べています。type
より具体的な例は
template <typename T, typename T::size_type S> ...
コンテナ タイプでインスタンス化された場合S
、コンテナの の定数になりsize_type
ます。
この場合、それはTag
typename が と呼ばれる typename 自体を定義することを意味しTag::type
ます。クラス内で型 (または静的変数/関数) を定義すると、クラスは名前空間として機能でき::
ます。そのため、名前空間がある場合と同様に、ここで使用します。
あなたの例はと同等です
<typename MyFirstType, typename MyFirstType::type MySecondType>