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