确定 std::function 的返回类型
Determining return type of std::function
我正在编写一个接收std::function
对象的模板函数(通过使用正确的参数调用std::bind
生成)。在此函数中,我想确定此函数对象的返回类型。可能吗?
事实上,我希望模板函数返回相同的类型。你能想到一种优雅的、基于标准的方式来实现这一目标吗?
像这样:
template <typename T>
T::return_type functionObjWrapper(T functionObject) {
// ...
return functionObject();
}
谢谢
您可以使用
decltype
和尾随返回类型来执行此操作:
template <typename T>
auto functionObjWrapper(T functionObject) -> decltype(functionObject()) {
// ...
return functionObject();
}
你正在寻找std::function<F>::result_type
即
template <typename F>
typename std::function<F>::result_type
functionObjWrapper(std::function<F> functionObject) {
// ...
return functionObject();
}
需要std::function<F>::result_type
前面的typename
,因为这是一个依赖类型名称。
template <class F>
std::result_of_t<F&()> functionObjWrapper(F functionObject) {
// ...
return functionObject();
}
std::result_of
采用"看起来像函数调用"的类型表达式。 然后,它会告诉您,如果您使用该可调用类型和这些参数进行函数调用会发生什么。
如果您缺少 C++14,请将std::result_of_t<?>
替换为 typename std::result_of<?>::type
,或编写自己的:
template<class Sig>
using result_of_t=typename std::result_of<Sig>::type;
在许多 C++11 实现中,result_of
甚至对 SFINAE 友好。
我确实F&()
而不是F()
,因为我们将使用类型 F
的非常量左值来执行调用。 如果你的最后一行是std::move(functionObject)()
或std::forward<F>(functionObject)()
,你会做result_of_t<F()>
。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- std::function 中不允许引用返回类型吗?
- 如何根据"function like"参数推导函数模板的返回类型?
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符
- 有没有办法获取"current function"的返回类型
- 确定"generic function"的返回类型
- 确定 std::function 的返回类型