参照を保持するコンテナ

同じ基本クラスを継承したクラスのオブジェクトがいくつかあり、それらをまとめて扱いたい場合と、専門特化して扱いたい場合、両方が同時に必要なことがたまにあります。
そんなときに、オブジェクトの参照を保持するコンテナが必要になるのですが、どうやらboost::reference_wrapperのコンテナを使用すればいいようです。


こんな感じになりました。

#include <iostream>
#include <string>
#include <vector>
#include <boost/ref.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/foreach.hpp>

struct Base {
    // 共通で使用する関数
    void print() const { std::cout << "print" << std::endl; }
};

struct Integer : Base {
    // 専門特化した関数
    int get_int() const { return 3; }
};

struct String : Base {
    // 専門特化した関数
    std::string get_string() const { return "Hello"; }
};

int main()
{
    Integer n;
    String s;

    std::vector<boost::reference_wrapper<Base> > v;
    v.push_back(boost::ref<Base>(n));
    v.push_back(boost::ref<Base>(s));

    // 共通関数を使用する
    BOOST_FOREACH (Base& base, v) {
        base.print();
    }

    // 専門特化した関数を使用する
    const int v1 = n.get_int();
    const std::string v2 = s.get_string();
}
print
print