2008-09-17 8 views
2

私は最初にint iでforループを使用してから次のようにしました:C++では、可変長のタプルを変更する関数を持つことができますか?

get<i>(my_tuple); 

そして、次のようにいくつかの値を格納します。結果。ただし、getconstexprでのみ動作します。

tuple変数を tupleから取り出し、それらを可変テンプレート関数に渡すことができれば、引数を非常に簡単に再帰することができますが、変数を getなしでタプルから取得する方法はわかりません。どのようにそれを行う上の任意のアイデアですか?あるいは、誰かがこの tupleを変更する別の方法を持っていますか?

答えて

4

「I」

get<i>(tup) 

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

+0

ありがとうございます!私のコードは次のようになります。 テンプレート のボイド楽しい(型名のstd ::タプル my_tuple)を{ (my_tuple)を取得します。 fun (my_tuple); } –

3

Boost.Fusionをご覧ください。 std::pairboost::tuple、他のいくつかのコンテナとそれ自身のタプル型を '反復'することができますが、それはまだstd::tupleをサポートしているとは思われません。

0

TR1のセクション6.1.3.4を見てみましょう、http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

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

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

次に、あなたの関数の引数は、非constタプルであり、あなたが提供された情報を使用して反復を書いた後、あなたが必要な割り当てを行うことができます取得します以前の回答では

0

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

関連する問題