2

この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(bar, 2)またはstd::get(2, bar)

4

2 に答える 2

10

関数には、コンパイル時に指定された、明確に定義された戻り値の型が必要です。ここで、テンプレートの特殊化は;get<2>を返す関数です。long&しかし、あなたのバージョンは実行時に指定された引数に応じて異なる型を返さなければならず、これは不可能です。

于 2013-08-17T03:41:34.467 に答える
5

うまくいけば、このデモンストレーションで十分な説明になります:

int x;
std::cin >> x;
auto i = std::get(bar, x);

C++ では、コンパイル時にオブジェクトの型を認識しなければならないことに注意してください。型とはi何ですか? 変数をテンプレート引数として渡すことはできないことに注意してください。定数式を渡す必要があるため、整数がテンプレート引数である場合、上記の問題は存在しません。

おそらく、あなたの例により関連するのはこれです。

std::cout << std::get(bar, x);

の各オーバーロードoperator<<は異なる関数です。どの関数を呼び出すかは、引数に基づいてコンパイル時に決定されます。では、コンパイラは上記のステートメントで呼び出すオーバーロードをどのように判断できるのでしょうか? オーバーロードすら持たないタプル メンバーがあった場合はどうなるでしょうか。

于 2013-08-17T03:43:00.583 に答える