gpt4 book ai didi

c++ - 使用 using 捕获模板化可调用对象的返回类型

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:49 24 4
gpt4 key购买 nike

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

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 为成员函数和自由函数重载,因此它可以与两者一起使用。

我不记得我是在哪里找到这个的,但大约是 here某处。

关于c++ - 使用 using 捕获模板化可调用对象的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com