タプルを展開して関数呼び出しするapply()
関数の導入に合わせて、タプルを任意の型に変換するmake_from_tuple()
関数が導入されます。
apply()
関数ではオブジェクトの構築までカバーができない(コンストラクタを呼び出せない)ので、そのコーナーケースをカバーするのが目的です。
この関数は、引数のタプルを展開して、テンプレートパラメータの型T
のコンストラクタ引数として渡し、T
型のオブジェクトを構築して返します。
make_from_tuple()
相当のことは、std::pair
クラスのpiecewiseコンストラクタがすでに行っています。(参照 : 「pairのpiecewise construction」)
また、make_from_tuple()
は、Boost.Fusionのcopy()
アルゴリズムに相当します。ユースケースとして、構文解析の結果となる「異なる型が混在した値のシーケンス」を受け取りたい結果型に変換するためにも使用できるでしょう。
#include <iostream> #include <string> #include <tuple> struct Person { int id; double bodyHeight; std::string name; Person(int id, double bodyHeight, const std::string& name) : id(id), bodyHeight(bodyHeight), name(name) {} }; int main() { std::tuple<int, double, std::string> t(1, 152.3, "Alice"); Person p = std::make_from_tuple<Person>(t); std::cout << p.id << std::endl; std::cout << p.bodyHeight << std::endl; std::cout << p.name << std::endl; }
宣言
// <tuple> namespace std { template <class T, class Tuple> constexpr T make_from_tuple(Tuple&& t); }
参照
- P0209R0
make_from_tuple
: apply for construction - P0209R1
make_from_tuple
: apply for construction - P0209R2
make_from_tuple
: apply for construction
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。