2

有没有办法在类级别使用 using 来获取可调用模板参数(lambda、可调用类、函数指针)的类型

template <typename FunctionType>
class SomeClass {
    using FunctionReturnType = /* extract return type of FunctionType */
};

我已经搞砸了decltypeand result_of,并给出了一个 a 的实例FunctionType以及我在成员函数内部完成的参数,但是似乎应该有一种方法可以在类级别执行此操作。

4

1 回答 1

5

我不确定你做错了什么,这似乎对我有用:

    template <class FType>
    struct SomeClass
    {
        using FunctionReturnType = 
            decltype(std::declval<FType>()(std::declval<int>()));
    };

    int f(int){return 0;}
    SomeClass<decltype(f)>::FunctionReturnType t = 0;

我只记得我有这段代码,我不久前在这个网站的某个地方找到了:

    #include <functional>

    template<typename T> 
    struct function_traits_impl;

    template<typename R, typename ...Args> 
    struct function_traits_impl<std::function<R(Args...)> >
    {
        static const std::size_t nargs = sizeof...(Args);

        typedef R result_type;

        template <std::size_t i>
        struct arg
        {
            typedef typename std::tuple_element<i, std::tuple<Args...> >::type type;
        };
    };

    template <class R, class T, class ... Args>
    function_traits_impl<std::function<R(Args...)> > function_traits(R(T::*)(Args...)const)
    {
        return function_traits_impl<std::function<R(Args...)> >();
    }

    template <class R, class T, class ... Args>
    function_traits_impl<std::function<R(Args...)> > function_traits(R(T::*)(Args...))
    {
        return function_traits_impl<std::function<R(Args...)> >();
    }

    template <class R, class ... Args>
    function_traits_impl<std::function<R(Args...)> > function_traits(R(*)(Args...))
    {
        return function_traits_impl<std::function<R(Args...)> >();
    }

您可能会发现它很有用。它的用法如下:

    typedef decltype(function_traits(&f)) f_info;
    static const unsigned num_args = f_info::nargs;
    typedef f_info::arg<0>::type arg_type;
    typedef f_info::result_type result_type;

它允许您获取参数的数量、它们的类型和函数的返回类型,而无需先验地了解函数。 function_traits为成员函数和自由函数重载,因此它可以同时使用。

我不记得我在哪里找到了这个,但它就在附近某个地方。

于 2013-10-05T04:03:41.293 回答