假设我有一个Shape
基类和Circle
, Line
, and Point
派生类。我有两个功能。
std::variant<Circle, Line, Point> process(const Shape &s);
Shape process(const Shape& s);
我可以传入任何派生类并在第二个函数中返回一个 Shape 对象,变体只是一个联合,可以在任何给定时间保存任何派生类变量。
现在与std::variant
我还可以雇佣一个visitor
我可以在其中根据我的变体当前持有的类型来处理某些函数(我可以创建一个函数对象并将其传递给std::transform
并将其应用到我的每个对象)。不过,我可以做这个功能virtual
在我的基类中,并让每个派生类实现它。
So, is variant
只是一个方便吗?
那么,变体只是为了方便吗?
不,它们是不同的概念。主要区别在于一方面std::variant
可以使用不相关的类型,包括内置类型,例如int
直接使用虚函数是不可能的。另一边std::variant
必须知道编译时正在使用的类型。例如,可以通过仅链接附加对象模块来添加具有虚拟函数的类型,而无需重新编译其余代码或将共享库动态加载到现有应用程序(您甚至不必重新启动应用程序),同时使用std::variant
您必须重新编译处理类型的代码std::variant
包含。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)