PStade.Oven hetero
昨日の記事のコメントで教えて頂いたので覚書。
PStade.Oven に tuple から任意の型の range へと変換する関数が用意されているらしいので使ってみた。
[ソース]
#include <pstade/oven/hetero.hpp> #include <boost/tuple/tuple.hpp> #include <boost/any.hpp> #include <iostream> #include <string> struct shape{ virtual void draw() = 0; }; struct rectangle : shape{ virtual void draw(){ std::cout << "rectangle" << std::endl; } }; struct triangle : rectangle{ virtual void draw(){ std::cout << "triangle" << std::endl; } }; struct circle : rectangle{ virtual void draw(){ std::cout << "circle" << std::endl; } }; int main(){ namespace oven = pstade::oven; rectangle r; triangle t; circle c; boost::tuple<rectangle*, triangle*, circle*> tup(&r, &t, &c); for(shape* s : oven::hetero<shape*>(tup)){ s->draw(); } auto tup2 = boost::make_tuple(42, std::string("homu"), 3.14f, std::string("mado")); auto any_range = oven::hetero<boost::any>(tup2); std::cout << boost::any_cast<int>(any_range[0]) << std::endl; std::cout << boost::any_cast<std::string>(any_range[1]) << std::endl; std::cout << boost::any_cast<float>(any_range[2]) << std::endl; std::cout << boost::any_cast<std::string>(any_range[3]) << std::endl; return 0; }
[出力]
rectangle triangle circle 42 homu 3.14 mado
なかなかよさげですね。
しかし、なんでもあるな PStade.Oven。