9

テンプレート テンプレート パラメータに関連する何かを探していたところ、テンプレート テンプレート テンプレート パラメータが標準で許可されていないと主張するこの回答にたどり着きました。

ただし、次のコードは最新の clang (3.2) および最新の GCC (4.8) でコンパイルされます。

template<template<template<typename> class> class T> struct test {};
template<template<typename> class T> struct foo {};
test<foo> bar;

これは拡張機能ですか、それとも他の回答は実際には正しくなく、標準で許可されていますか? そうでない場合、省略されている特定の理由はありますか?

4

1 に答える 1

8

std::vector<int>クラス テンプレートではstd::vector、型intがパラメーターとして渡されます。ではstd::get<42>(some_tuple)、関数テンプレートにパラメータとしてstd::get値が渡さ42れます。おそらく想像を絶するかもしれませんが、前者の種類の引数はテンプレートの型引数 (またはテンプレート型引数) と呼ばれ、後者の種類の引数は (テンプレート) 非型引数です。

ただし、テンプレートは別の種類の引数、つまり他のテンプレートも受け入れることができます。たとえばtemplate<template<typename> class T> void foo();、テンプレートを引数として取る関数テンプレートを宣言し、それ自体が型引数を取ります。(注として、テンプレートは型ではありませんが、「非型引数」という用語は、テンプレート テンプレート引数をカバーしていません。これは、のような引数のために予約されていますtemplate<int NonTypeArgument>。)

C++ にはテンプレート テンプレートのようなものは存在しないため (クラス、関数、およびエイリアス テンプレートがありますが、それらはまとめて単に「テンプレート」です)、テンプレート テンプレート テンプレート パラメータなどはありません。あなたが持っているのは、期待されるテンプレート引数にテンプレートテンプレート引数自体があるミルテンプレートテンプレートパラメーターの実行です。あなたが主張をリンクしている答えのように、これを禁止する参照を標準で見つけることができません。

于 2012-07-05T05:33:01.607 に答える