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。