C++のテンプレートテンプレートパラメータ(誤表記ではない)について。
以下をやりたい。つまりコンテナとテンプレート引数を別にとるようなテンプレートを書きたい。
しかしこれは動かない。
//エラー コンパイルできないtemplate< class Ty, class Type> auto makelistError() { Ty<Type> v; v.push_back(5); v.push_back(6); v.push_back(7); v.push_back(8); return v; }int main() { auto mylist = makelistError<std::vector, int>(); std::cout << "出力" << std::endl; for (auto it = std::begin(mylist); it != std::end(mylist); it++) { std::cout << *it << std::endl; } int i; std::cin >> i; }
template< template<class,class> class Ty, class Type> auto makelist() { Ty<Type, std::allocator<Type> > v;//STLのリスト構造は本来データ型とデータのallocatorの二つをとる v.push_back(5); v.push_back(6); v.push_back(7); v.push_back(8); return v; }int main() { auto mylist = makelist<std::vector, int>(); std::cout << "出力" << std::endl; for (auto it = std::begin(mylist); it != std::end(mylist); it++) { std::cout << *it << std::endl; } int i; std::cin >> i; }
makelistの第一テンプレート引数の意味は、「テンプレート引数を二つとる型」という意味になる。第二引数はそのまま。
vectorの場合、定義が以下のようになっているので、受け取る側もそれに合わせなければならない。
上記プログラムのstd::vectorの所をstd::listにしても正常に動作する。