テンプレートテンプレートという言葉に馴染みがない方もいらっしゃるかと思います。
テンプレートとは、よくご存知のように
template< class Type >
struct something;
こういうもので、Type
には基本的にどんな型でも入れることができます。
しかしTypeに入れることができない型があります。
それが、テンプレート引数が埋まっていない不完全な型です。
例えば、上記の構造体のテンプレートパラメータに、
something< std::vector< int > >
と入れることはできても、
something< std::vector >
と入れることはできません。
そうなると、somethingがこういう定義を持ちたい場合はどうでしょうか。
template< class Type >
struct something
{
Type< int > container;
}:
このsomethingはコンテナを包含するもので、このコンテナがlistだったりvectorだったりをテンプレートパラメータで指定したい・・・となると大変困る事がわかります。
そこで使われるのが、テンプレートテンプレートで、何も難しいことはありません。
template<
template< class, class > class Type >
struct something
{
Type< int, std::allocator < int > > container;
};
Typeは、テンプレート引数を2つ取る何らかの型、という意味です。
std::vectorやstd::listは実はアロケータを引数に取るので、テンプレート引数は2つです。
基本形はこの通りです。
template<
template< class > class Type >
struct somthing;
Typeの直前のclass
キーワードを忘れがちですので注意しましょう。
蛇足ですが、だったら、テンプレートテンプレートテンプレートパラメータも……あります。
template<
template<
template< class > class
> class Type >
struct something;
テンプレート引数を1つ取る何らかの型をテンプレート引数に1つ取る何らかの型をテンプレート引数に取る構造体です。わたしもこんがらがってきました。
ここまで来ると使う機会は来ないでしょう。