こういう関数オブジェクトがあったとき
struct functor { typedef ??? result_type; template <class Container> Container operator()(const Container& c) const { return c; } }; typedef std::tr1::result_of<functor(const std::vector<int>&)>::type type; std::cout << typeid(type).name() << std::endl; // std::vector<int> になってほしい
result_type の型はどう書けばいいのだろう
・・・こういうふうにしてみた
template <class Signature> struct argument_of; template <class R, class Arg> struct argument_of<R(Arg)> { typedef Arg type; }; template <class T> struct copy_argument { typedef typename std::tr1::remove_reference< typename std::tr1::remove_cv< typename argument_of<T>::type >::type >::type type; };
struct functor { template <class Signature> struct result : public copy_argument<Signature> {}; template <class Container> Container operator()(const Container& c) const { return c; } };