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などのテンプレートパラメータの使い方と若干違うんですね…。