質問
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 を使用して必要な割り当てを行うことができます。
タプル引数を関数呼び出しに巻き戻すためのテンプレート再帰の例については、ここでの私の回答をご覧ください。