読者です 読者をやめる 読者になる 読者になる

result_of 関数オブジェクトの戻り値の型をどう書くか

C++

こういう関数オブジェクトがあったとき

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;
    }
};