yohhoyの日記

技術的メモをしていきたい日記

タグ付きタプル型

C++標準ライブラリやBoost.Tupleライブラリが提供するタプル型(tuple)では、タプル要素へはインデクス指定でアクセスする。タプルの要素アクセスを名前(タグ)経由で行う方法についてメモ。(機能的には普通の “構造体(struct)” に相当。)

#include <tuple>
std::tuple<std::string, int, std::string> data = /*...*/;

std::cout << std::get<1>(data) << std::endl;  // index=1→int型要素にアクセス

本記事の内容はStack Overflowで見つけた質問と回答内容に基づく。

Stack Overflowのecatmurさん回答より利用側コードのみ引用(コメント補足追記)。

// タグ宣言
struct name {};  struct age {};  struct email {};

// タグ付きタプル(tagged_tuple<...>)を返す関数
tagged_tuple<name, std::string, age, int, email, std::string> get_record()
{
  return { "Bob", 32, "bob@bob.bob"};
}

// タグ名ageを基にし、int型の値32を取り出す
std::cout << "Age: " << get_record().get<age>() << std::endl;

メモ:回答へのコメントでは、別々のタグ付きタプル型に対して要素インデクス位置が異なっていてもタグ名でアクセスできる点が挙げられている。とはいえ、この程度なら素直にtemplate void f(const S& s) {s.email;}で十分だと思うが…