0

C++11 は非常に便利なコンテナ std::tuple を追加しました。今では多くの構造体を std::tuple に変換できます:

// my Field class
struct Field 
{
     std::string path;
     std::string name;
     int id;
     int parent_id;
     int remote_id;    
};

//create
Field field = {"C:/", "file.txt", 23, 20, 41 };  

 //usage
  foo( field.path );
  field.name= new_name;
  int id = field.id;

//to std::tuple,               /--path,  /--name      /--id, /--parend_id,   /--remote_id
using Field = std::tuple< std::string, std::string , int,   int ,           int >;

//create
auto field = make_tuple<Field>("C:\", "file.txt", 23, 20, 41);      



// usage
     foo( std::get<0>(field) );  // may easy forget that the 0-index is path
     std::get<1>(field) = new_name; // and  1-index is name
     int id = std::get<2>(field);   // and 2-index is id, also if I replace it to 3, 
                       //I give `parent_id` instead of `id`, but compiler nothing say about.

ただし、大きなプロジェクトで std::tuple を使用する場合の欠点が 1 つだけあります。タプルの各タイプの意味を簡単に忘れてしまう可能性があります。これは、名前ではなく、インデックスのみでアクセスするためです。

そのため、古い Field クラスを使用します。

私の質問は、この欠点をシンプルかつ美しく解決できるかということです。

4

4 に答える 4

5

はい、欠点を簡単かつ美しく解決できます。

仕事に適したツールを使用してください!この場合、構造体またはクラスです。

このような場合、タプルは構造体を置き換えるものではありません。工具箱に新しいピカピカのハンマーがあるからといって、それを使って木を切る必要があるわけではありません。

于 2014-02-15T16:32:45.637 に答える
4

ええと、概念的tupleにはプレーン オールドstructは非常に似ています。主な違いは、 のメンバーはstruct名前を使用してアクセスされるのに対し、 のメンバーはtupleインデックスを使用してアクセスされることです。

構造体として使用したいようですtuple-なぜ使用しないのstructですか?

于 2014-02-15T16:32:04.653 に答える
1

列挙型を使用して「フィールド名」を提供できます。

enum FIELDS { path, name, id, parent_id, remote_id };
auto field = make_tuple<Field>("C:\", "file.txt", 23, 20, 41);      

foo( std::get<FIELDS::path>(field) );  // may easy forget that the 0-index is path
std::get<FIELDS::name>(field) = new_name; // and  1-index is name
int id = std::get<FIELDS::id>(field);  

(編集後、列挙型はかなり一般的なフィールド名であるため、ここでは修飾されたバージョンを使用していますが、厳密には必要ではありません)

于 2014-02-15T16:12:39.003 に答える