std::result_of简单的功能
std::result_of simple function
#include <iostream>
#include <type_traits>
double f(int i)
{
return i+0.1;
}
struct F
{
public:
double operator ()(int i) { return i+0.1; }
};
int
main(int, char**)
{
std::result_of<F(int)>::type x; // ok
// std::result_of<f(int)>::type x; // error: template argument 1 is invalid
x = 0.1;
std::cerr << x << std::endl;
}
请解释为什么std::result_of<f(int)>::type x;
无效...
cppreference说"(std::result_of
(在编译类型上推导函数调用表达式的返回类型。
怎么了?
std::result_of<T>
要求T
是一个类型 - 但不仅仅是任何类型。 T
必须是函数类型,因此将使用result_of
的部分专用化:
template <class Fn, class... ArgTypes> struct result_of<Fn(ArgTypes...)>;
这样:
decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...))
格式正确 (C++11 20.9.7.6(。(调用在 20.8.2 中定义。
std::result_of<f(int)>
不起作用的原因是f
不是类型 - 它是函数类型的实例。要将x
声明为应用于int
的f
的返回类型,只需编写以下内容:
decltype(f(int{})) x;
或者,如果您更喜欢硬编码int
:
decltype(f(32)) x;
如果需要f
类型,请使用:
using FuncPtr = decltype(f);
然而,在提供的代码中F
(即不是小写f
(是一个类型,因此F(int)
定义了一个表示函数的类型,该函数在接受int
作为参数F
返回。显然这不是F是什么! F
的类型是一个结构,其实例可以使用函数调用运算符。 F
也没有显式或隐式构造函数采用int
等。这怎么能工作?简短回答:模板"魔术"。
本质上,std::result_of
的定义采用类型,F(int)
并将返回类型与参数类型分开,以便它可以确定 INVOKE(( 的哪种情况允许它工作。调用的情况有:
- F 是指向某个类 T 的成员函数的指针
- 如果只有一个参数,则 F 是指向类 T 的数据成员的指针,或者,
- F 的实例可以用作函数,即
declval<F>()(declval<int>())
它可以是普通的函数调用或某种类型的函子(例如,像您的示例一样(。
确定后result_of
就可以确定有效表达式的返回类型。这是通过result_of
的type
成员返回的内容。
这样做的美妙之处在于,result_of
的用户不需要知道它实际上是如何工作的。唯一需要了解的是result_of
需要一个函数 TYPE。如果使用的名称不是代码中的类型(例如,f
(,则需要使用decltype
来获取具有此类表达式的类型。
最后,不能将f
视为类型的部分原因是因为模板参数也允许常量值,并且f
是常量函数指针值。这很容易证明(使用问题对f
的定义(:
template <double Op(int)>
double invoke_op(int i)
{
return Op(i);
}
后来:
std::cout << invoke_op<f>(10) << std::endl;
因此,要获得使用某些int
正确调用f
表达式的返回值类型,可以编写:
decltype(f(int{}))
(注意:从不调用f
:编译器只是使用decltype
中的表达式来确定其结果,即在这种情况下的返回值。
- 具有检查功能的简单数字生成器,以避免重复
- AVR-GCC:(看似)简单功能中不需要的序言/尾声
- 简单计算器的难以理解功能(Stroustrop 编程原理书)
- C++中是否有一个功能可以创建一个像Python的"numpy.bmat"一样简单的块矩阵?
- 关于简单C 功能的混乱
- 运行简单的C 功能
- 简单的功能大小;了解指针-指针差异
- Arduino陷入简单的C++功能
- 用于二分搜索的错误简单功能(C++)
- 为什么这个简单的功能没有去虚拟化?
- 如何实现简单的C 功能
- 尝试将简单按钮绑定到SFGUI中的OnClick功能
- 如何准确测量和比较opencl速度以实现循环功能的简单速度
- 简单的二进制搜索树非递归添加功能
- 带有简单功能的boost :: ASIO服务器
- 如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少
- 对于此简单功能,为什么编译器输出如此不同
- 为什么STD :: IS_FUNCTION返回false以获取简单功能和lambdas
- 简单的C++字符数组加密功能 - 段故障
- 一个简单的C 功能,在不同的计算机上具有不同的答案