の
template <template <class X> class T>
テンプレート型パラメーターX
は、最も外側のテンプレートに対するテンプレート パラメーターではありません。これは、最も内側のテンプレートに対するテンプレート パラメーターです。それはかなり似ています
int foo(int (*bar)(int x))
{
int y = x; // compiler error
}
関数は単一の引数を取るため、これは機能しませんbar
: 引数がありませんx
。
本当に何をしようとしているかに応じて、次のような 2 番目のテンプレート パラメーターを追加できます。
template <typename X, template <typename> class T >
struct Bar
{
// ...
};
単一の型パラメーターで宣言を保持できますが、パターン マッチにより、例のコンテキストでクラスを定義する部分的な特殊化が行われます。
template <typename T>
struct Bar;
template <typename X, template <typename> class T >
struct Bar<T<X>>
{
// ...
};
便利なネストされた型を持つように変更Foo
し、その方法でそれをつかむことができます
template <typename T>
struct Bar
{
using X = T::value_type;
};
または、テンプレート型からテンプレート パラメータを抽出するメタ関数を定義して、その方法で取得することもできます。
template <typename T>
struct Bar
{
using X = get_parameter<T>;
};
テンプレート引数を抽出するメタ関数ではなく、関数を宣言し、 (または)get_bar_parameter
からテンプレート パラメーターを抽出する部分的な特殊化を定義することを除いて、最も柔軟なのは最後のバージョンです。そうすれば、 の正しい値がそのように計算されないクラスで使用することを将来決めた場合、 に適切な特殊化を与えることでそうすることができます。Foo<X>
T<X>
Bar
X
get_bar_parameter