0

std::get以下の関数構文に注意してください。

std::tuple <int, double, long &, const char *> bar(18, 6.5, 12, "Hello!");
cout << std::get<2>(bar); // Print the tuple’s third element.

私はこの構文に慣れていません...
これは引数を渡すためにテンプレート構文を使用していますか?
はいの場合、どのように機能するかの簡単な例を提供してくださいstd::get

4

4 に答える 4

4

他のものと同じように、テンプレート パラメーターに引数としてものを渡すことができます。おそらく、次のように型を引数として渡すことに慣れているでしょう。

template<typename T>
void f() {}

次のように関数を呼び出しますf<int>()

これは、具象型に拡張されていることを除いて、同じ概念です。

例:

#include <iostream>

template<size_t N>
void f() {
    std::cout << N << '\n';
}

int main() {
    f<10>();
    f<11>();
    f<100>();
}

出力:

10
11
100

したがって、typeを渡す代わりに、指定された型のコンパイル時の値を渡しています。

于 2013-08-15T00:54:34.727 に答える
0

std::getある種のシーケンスから項目を取得するための汎用関数テンプレートです。

これは、 、、およびstd::tupleの間で一般的なインターフェイスの一部です。ユーザーとして、それを他のものに一般化することができます。tuplearraypair

std::array< int, 5 > blah {{ 2, 42, 9, 1, 3 }};
int fortytwo = std::get< 1 >( blah );

シーケンス インデックスは と同様に<2>テンプレート引数ですが、型ではなく値です。テンプレートはこれを可能にします。それらは非型引数と呼ばれ、より一般的な型引数と対等に存在します。(ただし、明確で正確な値のみが許可されるため、型以外の引数の型には一定の制限があります。)<int>std::vector<int>

テンプレートはコンパイル時に処理されるため、テンプレート引数はコンパイル時の定数でなければならないことに注意してください。これは、少なくとも C++11 ではうまくいきません。

int fortytwo = std::get< std::get< 3 >( blah ) >( blah );

(構造体の内容が定数である限り、このconstexpr機能を使用して、そのようなことをサポートするカスタム関数を作成することは可能ですが、C++14 には がある予定constexpr getなので、これは機能します。)

于 2013-08-15T00:56:13.637 に答える
0

はい、テンプレート パラメーターは型である必要はありません。非型テンプレート パラメータには、いくつかの異なる種類があります。次のいずれかになります。

  • 整数型または列挙型
  • オブジェクトへのポインタまたは関数へのポインタ
  • オブジェクトへの参照または関数への参照
  • メンバーへのポインター

この場合、テンプレート パラメータstd::getがあります。size_t

于 2013-08-15T01:01:27.803 に答える