読者です 読者をやめる 読者になる 読者になる

boost::fusion::copy

C++

Boost 1.47.0から、Boost.Fusionにcopyアルゴリズムが入ります。
シーケンスの内容を他のシーケンスにコピーするアルゴリズムですが、主な使用目的はシーケンスの型変換です。
boost::fusion::vectorを、Fusionシーケンスとしてアダプトされたユーザー定義型に変換したい場合に使えます。

#include <iostream>
#include <string>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/copy.hpp>

struct Person {
    int id;
    std::string name;
    int age;

    Person() : id(0), age(0) {}
    Person(int id, const std::string& name, int age)
        : id(id), name(name), age(age) {}

    void print() const
    {
        std::cout << id << "," << name << "," << age << std::endl;
    }
};

BOOST_FUSION_ADAPT_STRUCT(
    Person,
    (int, id)
    (std::string, name)
    (int, age)
);

namespace fusion = boost::fusion;

int main()
{
    const fusion::vector<int, std::string, int> v(1, "Akira", 26);

    Person p;
    fusion::copy(v, p);

    p.print();
}
1,Akira,26

Fusionのcopyアルゴリズムは以前書いて、参照の引数を書き換えるようなmutableアルゴリズムはFusionの設計思想に合わないだろうな、と思って提案しなかったのですが、その直後くらいにcopyアルゴリズムがtrunkに追加されてました…。copyアルゴリズムのためにauxiliaryという新たなカテゴリが用意されてましたね…こんなことなら提案すればよかった。


Fusion Sequenceの変換(ボツ)
Boost.Fusion copyアルゴリズムを書いた