使用方法捕获模板化可调用对象的返回类型

Capture return type of templated callable object with using

本文关键字:调用 对象 返回类型 使用方法      更新时间:2023-10-16

有没有办法在类级别使用

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

我已经弄乱了decltyperesult_of,并给出了一个FunctionType的实例以及我在成员函数中完成的参数,但是似乎应该有一种方法可以在类级别执行此操作。

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

    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 对成员函数和自由函数都重载,因此它将同时适用于两者。

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