c++ - 寻求更好地理解 std::visit
问题描述
从https://en.cppreference.com/w/cpp/utility/variant/visit:
- 的返回值是
visit
多少?我不明白“选择调用访问者”?
示例代码
// Don't understand what this means, can explain? It's a templated func with trailing return type but no body?
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
// Why would the visitor function use && instead of &?
std::visit([](auto&& arg){std::cout << arg;}, v);
解决方案
了解访问者的最简单方法是将它们与多态性进行比较。在多态类中,您有一个基类,它具有虚函数,以及覆盖这些函数的派生类。您创建派生类的对象,并将它们存储为就好像它们是基类的对象(主要是指针)。当您在基类指针中调用虚函数时,它们将从您最初创建的类型(即派生类类型)中调用函数。
访问者完全相同,但类型安全。但是,访问者没有基本类型。您基本上将所有“派生”类型(即具有要调用的方法的类型)存储在变体对象中(它们并没有真正存储,它们实际上是互斥的,这是变体的本质)。变体对其持有的对象类型不可知,就像基类对其持有的派生类型不可知一样。就像在基类指针中调用方法(如上所述),将导致在派生中调用覆盖方法,这同样适用于变体。当您“访问”时,将使用该类的正确变体来调用下面的函数。
这里有一个问题:当你将多个类型放入一个变体中并访问其中的方法时,与多态类型结构不同,方法不必共享相同的返回类型。因此,如果一个类中的一个方法返回 int,而另一个类中的另一个同名方法返回一个 double,并且您访问包含这两者的变体,则取决于在变体中实例化的是哪个,将返回正确的返回类型.
文字太多,我知道。希望有帮助。
推荐阅读
- statistics - 仅使用 x 轴变量匹配两个直方图的算法
- c# - xamarin 表单图像不显示
- kendo-ui - Kendo UI 将 datePicker 绑定到列
- amazon-web-services - AWS System Manager 启动会话:调用 StartSession 操作时发生错误 (TargetNotConnected):
未连接 - java - 具有泛型约束的 C# 方法重载
- c# - C# 中的字段不能是通用的吗?
- ansible - ansible:我没有收到任务的完整错误消息
- jquery - $(...).intercode 不是函数 Phone.js
- amazon-web-services - Terraform - 启用访问负载均衡器日志 InvalidConfigurationRequest:存储桶的访问被拒绝
- javascript - “不可迭代”使用钩子从单独的文件夹进行 API 调用