1

(私はVisual C +++ 2010を使用しています)次のようなタプルを定義したとします。

typedef std::tr1::tuple<
int      //i want to set its default value to 9
, double //i want to set its default value to 3.3
, int    //i want to set its default value to 2
, double //i want to set its default value to -7.2
> Mytuple; 

構造体でそれを行うことができます。しかし、私はでそれを行うことが可能かどうか疑問に思いstd::tr1::tupleます。
その上、私はいつ私が使うべきか知りたいですstd::tr1:tupleまたはstruct?

誰かが私を助けることができますか?

4

1 に答える 1

5

Atupleは構造体の魔法の代わりではありません。それらの目的は非常に異なります。構造体は、何よりもまず、言語構造体です。Atupleライブラリ構造です。

構造体はデフォルト値を持つようになります。これは、コンストラクターを記述してデフォルト値を与えることができると言語が言っているためです。次に、言語はそのコンストラクターを呼び出して構造体を初期化する責任を負います。tupleライブラリ構造として、そのような機能はありません。常に自動的に使用されるstd::vector<T>デフォルトを指定できる以上の機能はありません。各メンバーに初期値を指定することはできますが、デフォルトTを指定することはできません。

そして、あなたがそれについて考えるならば、あなたはしたくないでしょう。tuple<int, float>すべてが常に3と54.221で作成されたと誰かが言うことができると想像してみてください。このルールについて何も知らない他のコードがそれを作成したとしても、それに従う必要があります(そのタイプが使用されるすべての場所でタイプのコンストラクターが使用されるのと同じように)。覚えておいてください:すべてtuple<int, float>が同じタイプです。

実際、atupleは、構造体でリフレクションを実行し、そのメンバーに対してコンパイル時の反復を実行できないことの代わりになります。それらが存在する他の主な理由は、コンパイル時の動的構造(つまり、ファイルに直接書き込まれる静的リストではなく、コンパイル時の引数に基づいて型の集計を作成する機能)を持つことができることです。

したがって、std::tie(複数の値を効果的に返すために)、メンバーを反復処理する(つまり、オブジェクトのメンバーごとにテンプレート関数を呼び出す)、または同様の特殊なコードを使用する必要がない限り、構造体を使用する必要があります。

于 2012-11-09T05:36:39.637 に答える