1. ホーム
  2. c++

[解決済み】テンプレートのテンプレート・パラメーターの使い方は?

2022-03-31 23:44:20

質問

C++でテンプレート・パラメータ(テンプレートをパラメータとして受け取るテンプレート)を使って、ポリシーベースのクラス設計を行う例をいくつか見ました。このテクニックには他にどんな使い道があるのでしょうか?

どのように解決するのですか?

このようにテンプレートに依存した型を持つパラメータを渡すには、テンプレート構文を使う必要があると思います。

template <template<class> class H, class S>
void f(const H<S> &value) {
}

ここです。 H はテンプレートですが、私はこの関数で H .

ノート : 私は何年もc++のプログラミングをしていますが、これが必要になったのは一度だけです。めったに必要ない機能だと思います(もちろん、必要なときは便利です!)。

正直なところ、ほとんどの場合、これは必要ないのですが、例を工夫してみましょう。次のように考えてみましょう。 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;
}

というのが、このタイプのコードの書き方です。