【发布时间】:2018-09-12 13:54:13
【问题描述】:
假设我有一个Shape 基类和Circle、Line 和Point 派生类。我有两个功能。
std::variant<Circle, Line, Point> process(const Shape &s);
Shape process(const Shape& s);
我可以传入我的任何派生类并在第二个函数中返回一个 Shape 对象,变体只是一个联合,可以在任何给定时间保存我的任何派生类变量。
现在有了std::variant,我还可以使用visitor,我可以根据我的变体当前持有的类型来处理一些函数(我可以创建一个函数对象并将其传递给std::transform并将其应用于每个我的对象)。但是,我可以在我的基类中创建该函数 virtual 并让每个派生类实现它。
那么,variant 只是为了方便吗?
【问题讨论】:
-
您似乎认为
std::variant的模板参数必须共享一个共同的基础。您可以将不相关的类型存储在std::variant中。 -
恕我直言太宽泛了,虽然最明显的是你可以将任何类型放入一个变体中,而你不能多态地使用
Circle和Rectangle,除非它们都继承Shape,这是一个很小但很大的区别 -
例如
std::variant<int,double,std::string>,没有机会通过继承获得接近它的任何地方 -
FWIW:
Shape process(const Shape& s)与std::variant<Circle, Line, Point> process(const Shape &s)与前slices the object 不同。您需要通过引用/智能指针/指针返回。 -
不错的比较在这里:Inheritance vs
std::variant
标签: c++ variant boost-variant