C++と色々

主にC++やプログラムに関する記事を投稿します。

boost::fusion::vectorで異なる型のコンテナ

動的な多態性を持った型のオブジェクトをコンテナで扱いたい場合、基本クラスの参照型または基本クラスのポインタ型のコンテナを使うことができます:

#include <iostream>
#include <memory>
#include <vector>

struct A
{
    void disp() const
    {
        do_disp();
    }
private:
    virtual void do_disp() const = 0;
};

class B : public A
{
    void do_disp() const override
    {
        std::cout << "B\n";
    }
};

int main()
{
    std::vector<std::shared_ptr<A>> v;
    v.emplace_back(std::make_shared<B>());
    for (auto const& a : v) {
        a->disp();
    }
}

実行結果

B

静的な多態性を持つ型のオブジェクト(同じインターフェイスを持つ、継承関係など一切ない型)を同じコンテナで扱いたい場合はboost::fusion::vectorを使うことが出来ます:

#include <iostream>
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/container/vector.hpp>

struct A
{
    void disp() const
    {
        std::cout << "A\n";
    }
};

struct B
{
    void disp() const
    {
        std::cout << "B\n";
    }
};

int main()
{
    A a;
    boost::fusion::vector<A> const v{a};
    B b;
    auto const v2 = boost::fusion::push_back(v, b);
    boost::fusion::for_each(v2, [](auto const& a) {
        a.disp();
    });
}

実行結果

A
B