スポンサーリンク

| キーワード:

テンプレートテンプレートパラメータ(基本)

C++のテンプレートテンプレートパラメータ(誤表記ではない)について。

1.動かないサンプル

以下をやりたい。つまりコンテナとテンプレート引数を別にとるようなテンプレートを書きたい。

しかしこれは動かない。

     
//エラー コンパイルできない
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; }

2.動くサンプル

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にしても正常に動作する。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: