meryngii.neta

今日も新たな"ネタ"を求めて。

std::result_ofの実装

std::result_ofを即席で作ってみました。

template <class> class result_of; // undefined

template <class Fn, class... ArgTypes>
class result_of<Fn(ArgTypes...)> {
public:
	typedef decltype((*(Fn*)0)((*(ArgTypes*)(0))...)) type;
};

テストコードはこんな感じ。

#include <iostream>
#include <typeinfo>

template <int> struct A { };

struct Functor
{
	A<0> operator()();
	A<1> operator()(int);
	A<2> operator()(int, double);
};

int main()
{
	std::cout << typeid(result_of<Functor()>::type).name() << std::endl;
	std::cout << typeid(result_of<Functor(int)>::type).name() << std::endl;
	std::cout << typeid(result_of<Functor(int, double)>::type).name() << std::endl;
}
1AILi0EE
1AILi1EE
1AILi2EE

よく考えてみるとBoost.Functionなどのテンプレートパラメータの使い方と若干違うんですね…。