テンプレートパラメータの用途にはどのようなものがありますか? 質問する

テンプレートパラメータの用途にはどのようなものがありますか? 質問する

ポリシーベースのクラス設計を行うために、テンプレート テンプレート パラメータ (つまり、テンプレートをパラメータとして受け取るテンプレート) を使用する 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;
}

これが私がこのタイプのコードを記述したい方法です。

おすすめ記事