C++ では、可変長のタプルを変更する関数を使用できますか?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

質問

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?

役に立ちましたか?

解決

の「i」なので、

get<i>(tup)

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

他のヒント

ブースト・フュージョン 一見の価値があります。「反復」できる std::pair, boost::tuple, 、他のいくつかのコンテナと独自のタプルタイプ、ただしサポートしていないと思います std::tuple まだ。

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

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 を使用して必要な割り当てを行うことができます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top