ポリシーベースのクラス設計を行うために、テンプレート テンプレート パラメータ (つまり、テンプレートをパラメータとして受け取るテンプレート) を使用する C++ の例をいくつか見たことがあります。この手法には他にどのような用途がありますか?
ベストアンサー1
次のように、別のテンプレートに依存するテンプレート型のパラメータを渡すには、テンプレート テンプレート構文を使用する必要があると思います。
template <template<class> class H, class S>
void f(const H<S> &value) {
}
ここでは、H
テンプレートですが、この関数で のすべての特殊化を処理する必要がありましたH
。
注: 私は長年 C++ をプログラミングしてきましたが、この機能が必要になったのは 1 回だけです。この機能が必要になることはめったにないと思います (もちろん、必要なときには便利です)。
私は良い例を考えようとしてきましたが、正直に言うと、ほとんどの場合これは必要ありませんが、例を考えてみましょう。には がないstd::vector
とtypedef value_type
仮定しましょう。
では、ベクトルの要素に適切な型の変数を作成できる関数をどのように記述すればよいでしょうか? これは機能します。
template <template<class, class> class V, class T, class A>
void f(V<T, A> &v) {
// This can be "typename V<T, A>::value_type",
// but we are pretending we don't have it
T temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
注:にstd::vector
は、type と allocator という 2 つのテンプレート パラメータがあるため、両方を受け入れる必要がありました。幸い、型推論により、正確な型を明示的に記述する必要はありません。
次のように使用できます:
f<std::vector, int>(v); // v is of type std::vector<int> using any allocator
あるいは、次のようにすることもできます。
f(v); // everything is deduced, f can deal with a vector of any type!
更新: この不自然な例は、説明的ではありますが、c++11 で が導入されたため、もはや驚くべき例ではありませんauto
。現在、同じ関数は次のように記述できます。
template <class Cont>
void f(Cont &v) {
auto temp = v.back();
v.pop_back();
// Do some work on temp
std::cout << temp << std::endl;
}
これが私がこのタイプのコードを記述したい方法です。