2

C ++ 0xでは、次のような関数を記述したいと思います。

template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
    //Put things into the tuple
}

私は最初にforループを使用してから、次のint iことを実行しました。

get<i>(my_tuple);

そして、結果に値を格納します。ただし、でgetのみ機能しconstexprます。

から変数を取得して可変個tuple引数のテンプレート関数に渡すことができれば、引数を非常に簡単に繰り返すことができますが、。なしでタプルから変数を取得する方法がわかりませんget。それを行う方法について何かアイデアはありますか?または、これを変更する別の方法がありtupleますか?

4

5 に答える 5

4

の「i」から

get<i>(tup)

コンパイル時の定数である必要があります。テンプレートのインスタンス化は、値を「反復」(実際には再帰) するために使用されます。ブースト タプルには、ここで役立つ「長さ」と「要素」のメタ関数があります。C++0x にもこれらがあると思います。

于 2008-09-17T06:39:14.343 に答える
3

Boost.Fusionは一見の価値があります。std::pair、 、その他のコンテナと独自のタプル型を「反復」できますが、まだboost::tupleサポートしているとは思いstd::tupleません。

于 2008-09-17T07:05:15.263 に答える
0

タプル引数を関数呼び出しに巻き戻すためのテンプレート再帰の例については、こちらの回答をご覧ください。

タプルを可変個引数テンプレート関数の引数に展開するにはどうすればよいですか?

于 2009-10-23T03:52:41.177 に答える
0

TR1 のセクション 6.1.3.4 ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf ) を参照してください。

get は、const 修飾タプルと非 const 修飾タプルの両方に対して定義され、適切な参照型を返します。関数宣言を次のように変更した場合:

template 
void fun(typename std::tuple& my_tuple) {
    //Put things into the tuple
}

次に、関数への引数は非 const タプルであり、前の応答で提供された情報を使用して反復を記述したら、get を使用して必要な割り当てを行うことができます。

于 2008-09-19T16:17:30.260 に答える
0

AFAICT、C++ タプルは基本的に再帰で処理する必要があります。型システムの唯一の可変個引数テンプレート処理を使用する以外に、タプルをパック/アンパックする実際の方法はないようです。

于 2008-09-19T16:20:49.863 に答える