使用方法捕获模板化可调用对象的返回类型
Capture return type of templated callable object with using
有没有办法在类级别使用
template <typename FunctionType>
class SomeClass {
using FunctionReturnType = /* extract return type of FunctionType */
};
我已经弄乱了decltype
和result_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
对成员函数和自由函数都重载,因此它将同时适用于两者。
我不记得我在哪里找到这个,但它就在这里的某个地方。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- C++17 如何保存泛型可调用对象以供以后使用
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在C++中将可调用对象放入地图中?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 广义 std::function (std::any 表示可调用对象)
- c++ 替换调用对象方法的宏函数
- 将可调用对象传递给采用 std::function 的构造函数
- 双指针在使用 new 时不调用对象构造函数
- 可调用对象作为默认模板参数
- 只需调用对象即可获取对象数据
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 如何将当前替代类型的 std::variant 传递给可调用对象?
- C++对象本身作为参数调用对象的方法
- 从移交的类调用对象