首页 > 解决方案 > 寻求更好地理解 std::visit

问题描述

https://en.cppreference.com/w/cpp/utility/variant/visit

  1. 的返回值是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);

标签: c++stlvisitor-pattern

解决方案


了解访问者的最简单方法是将它们与多态性进行比较。在多态类中,您有一个基类,它具有虚函数,以及覆盖这些函数的派生类。您创建派生类的对象,并将它们存储为就好像它们是基类的对象(主要是指针)。当您在基类指针中调用虚函数时,它们将从您最初创建的类型(即派生类类型)中调用函数。

访问者完全相同,但类型安全。但是,访问者没有基本类型。您基本上将所有“派生”类型(即具有要调用的方法的类型)存储在变体对象中(它们并没有真正存储,它们实际上是互斥的,这是变体的本质)。变体对其持有的对象类型不可知,就像基类对其持有的派生类型不可知一样。就像在基类指针中调用方法(如上所述),将导致在派生中调用覆盖方法,这同样适用于变体。当您“访问”时,将使用该类的正确变体来调用下面的函数。

这里有一个问题:当你将多个类型放入一个变体中并访问其中的方法时,与多态类型结构不同,方法不必共享相同的返回类型。因此,如果一个类中的一个方法返回 int,而另一个类中的另一个同名方法返回一个 double,并且您访问包含这两者的变体,则取决于在变体中实例化的是哪个,将返回正确的返回类型.

文字太多,我知道。希望有帮助。


推荐阅读