代码之家  ›  专栏  ›  技术社区  ›  Mutating Algorithm

与传统的多态处理相比,使用std::variant有哪些优点?

  •  2
  • Mutating Algorithm  · 技术社区  · 6 年前

    假设我有一个 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

    2 回复  |  直到 6 年前
        1
  •  7
  •   NathanOliver    6 年前

    那么,变体只是一种方便吗?

    不,它们是不同的概念。一方面的主要区别是 std::variant int 这是不可能与虚拟函数直接。在另一边 必须知道它在编译时使用的类型。例如,可以添加具有虚拟函数的类型,只需链接其他对象模块,而无需重新编译其余代码,也无需在使用时将共享库动态加载到现有应用程序(甚至无需重新启动应用程序) 标准::变量 必须重新编译处理类型的代码 包含。

        2
  •  2
  •   AndyG    6 年前

    但是,我可以在基类中使该函数成为虚拟函数,并让每个派生类实现它。

    variant Slava already mentioned ).

    变体 ,不一定 任何

    结合 std::visit ,有很多技巧可以确保在为给定的函数调用适当的函数时(基本上)没有运行时开销 std::variant . 尽管可能会有额外的编译时间和内存使用,因为它是通过创建一个大的函数指针矩阵来实现的( See this excellent blog post from Michael Park 关于它)

    推荐文章