推导独立函数的返回类型
Deducing the return type of a standalone function
我试图找出非成员函数的返回类型。我最初认为std::result_of
可以完成这项工作,但看起来后者只适用于可调用对象。特别是std::result_of<decltype(f)>::type
不工作。我终于想出了一些可以工作的代码
#include <iostream>
#include <typeinfo>
void f(int); // we deduce the returning type of this function
template<typename Ret, typename... Args>
struct Helper
{
using type = Ret;
};
template<typename Ret, typename... Args>
Helper<Ret, Args...> invoke(Ret(*fp)(Args...))
{
return {};
}
template<typename Ret, typename... Args>
using Return_Type = typename Helper<Ret, Args...>::type;
int main()
{
std::cout << typeid(decltype(invoke(f))::type).name() << std::endl; // fine
}
我在这里使用了一个额外的函数,模板invoke
,它接受一个指向我想要推断返回类型的函数的指针,并返回一个"helper"结构,从中我读取实际的返回类型。
代码看起来有点复杂,因为它涉及到一个调用函数(尽管没有执行实际的求值)。有没有其他更简单、更清晰/更短的方法来做这件事?
查阅我自己以前的博客文章,我发现:
template< class Func >
struct ResultOf
{
typedef typename std::function<
typename std::remove_pointer<Func>::type
>::result_type T;
};
template<typename>
struct return_t_impl;
template<typename Ret, typename... Args>
struct return_t_impl <Ret(Args...)>
{
using type = Ret;
};
template<typename Ret, typename... Args>
struct return_t_impl<Ret(*)(Args...)> : return_t_impl<Ret(Args...)> {};
template<typename T>
using return_t = typename return_t_impl<T>::type;
并将其用作:
using type = return_t<decltype(f)>; //type is void
template<class F>
using return_t = typename std::function<std::remove_pointer_t<std::decay_t<F>>>::result_type;
相关文章:
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?