问题标签 [std-variant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
94 浏览

c++ - 是否有 std::variant 和 std::visit 方法来替换旧的旧式调度以处理混乱的代码?

有一个无法修改的旧代码。如果简化它看起来像这样:

此外,还有“多态”属性访问,允许更改:

有没有办法只用 std::variant 和 std::visit 替换 prop1ref 中的属性访问代码?

请注意,prop1 名称和类型在类之间确实匹配,但位置(偏移量)不匹配。类型字段偏移得到保证,因此始终可以进行转换。此外,新代码应允许在不使用宏的情况下访问 A、B、C 类中的双 prop2、字符串 prop3 等。

0 投票
2 回答
513 浏览

c++ - std::get_if (std::variant) 通过指针而不是值/&/const& 获取变体参数是否有任何实际原因?

我从未使用过std::get_if,并且由于它的名称与 不同std::get,因此我看不出它的参数应该是指针¹(而std::get具有引用参数)的原因。


¹如果它也被命名std::get,那么重载决议就足够了。


是的,我的问题可能是因为 std:: any_cast () 和 std::get_if(std::variant) 绝对有必要将指针作为参数?,但关键是那里没有解决vs的答案,只有一条评论;唯一的答案集中在.std::get_ifstd::getstd::any_cast

0 投票
1 回答
208 浏览

c++ - 从类型名称列表中提取 C++ 变体类型

我正在设计一个管道类,它需要std::variant从过滤器类中的不同类型列表中提取一个。例如:

例如,如果我有三种不同的过滤器类型:

那么,变体应该是std::variant<int, double, std::string>. 但是,我需要删除变体中的重复类型,例如:

那么,变体不应该是std::variant<int, double, std::string, int>but std::variant<int, double, std::string>。此外,我需要替换voidstd::monostate. 例如:

那么,变体应该是std::variant<int, double, std::monostate>.

如何template <typename... Filters>使用 c++17 设计这样一个可以根据给定类型名称正确定义变体类型的元类?

0 投票
1 回答
223 浏览

c++ - C++17 std::variant 比动态多态性慢?

我正在关注这个博客,并试图将动态多态性代码替换为使用std::variantand std::visit。但我无法让std::variant+std::visit比虚拟结构 impl 更好地工作。它慢了大约1.3-1.5 倍!(GCC 10.3 -O3 C++17)

用例如下。假设我们正在比较两个表的第 i 行和第 j 行。表可能具有异构类型的列。假设我们可以访问列缓冲区。我正在做的是测试,

对于动态多态性,我有以下intfloat

这被转换为std::variant+std::visit如下。

我在这里进行了基准测试 https://quick-bench.com/q/u-cBjg4hyQjOs6fKem9XSdW7LMs

有人可以解释为什么这个std::variant+std::visit选项比动态多态方法慢吗?我期待否则!我的方法和/或基准有问题吗?

0 投票
4 回答
165 浏览

c++ - “增量”`std::variant` 替代

我想增加/减少 astd::variant的替代类型,基本上像这样:

这里的问题是,虽然emplace期望 clang 的错误消息称为“明确指定的参数”,index但似乎不是constexpr.

显而易见的替代方案是这样的:

但这就是我个人所说的“极其丑陋”和“维护背后的巨大痛苦”(特别是因为我必须逐个地维护这些块的两个几乎副本以用于递增和递减)。

有没有更好/“正确”的方式来做到这一点?

如果该信息在任何方面都很重要,我的目标C++20是.clanglibstdc++

0 投票
2 回答
94 浏览

c++ - 如何在 C++ 中 std::visit 调用的运算符函数中联合多种类型?

我正在使用 std::variant 和 std::visit 来调用运算符函数。我有很多变体(主要从一个超类继承),但大多数运算符函数应该返回相同的值。有没有办法拥有一个运算符函数,每次调用其中一个子类时都会调用该函数(例如,如果使用子类作为参数调用普通函数并且如果没有这样的函数,则(重载) 函数被调用,如果超类是一个参数。

举个例子可能更容易理解:

我有两个超类: struct function_node; struct nary_node; 我还有多个继承自这些超类的类:

我有另一个类,其中有这些类作为变体:

我终于有了最后一个类(constant_checker),它评估表达式。

在这最后一堂课中,我目前有多种形式的运算符函数:

这很好用,但我实际上有很多这样的子节点。由于操作符函数都应该返回相同的值,我想要一个操作符函数,例如

我已经以这种确切的方式尝试过,但我收到错误

如果我为这个确切的节点(在这种情况下为减节点)插入运算符函数,然后为其他节点再次发生此错误,则此错误将消失,因此显然不会调用通用运算符函数。

有什么解决方案吗,还是我必须保留每个操作员功能?

0 投票
1 回答
148 浏览

c++ - C++ 编译器错误:使用已删除的函数 std::variant()

我不断收到以下错误消息,告诉我我正在使用已删除的函数,我认为这是 std::variant 默认构造函数。

代码大致是:

我尝试在自定义构造函数 Document(StateVariant &&a_state) 的初始化列表中添加一个默认构造函数调用,但这似乎也不起作用。感谢您对理解这条神秘信息的任何帮助。抱歉,代码太长了。

0 投票
1 回答
47 浏览

c++ - 当通过 std::variant 而不是继承进行多态性时减少冗长的技术

假设您在 2D 游戏框架或类似的东西(例如 GUI 框架)中有实体,其中有各种类型的实体共享位置和旋转等公共属性,但其中一些属性必须在每个实体类型上处理例如,旋转一个简单的精灵与旋转一个绑定的 2D 动画骨架不同。

显然,这可以通过传统的 OOP 继承层次结构来处理......但是,我感兴趣的是使用“组合而不是继承”来表示这些实体,方法是拥有一个没有任何东西继承自被调用的具体类,该类actor具有用于状态的香草成员变量跨实体类型以相同的方式处理,但也与包含必须以每个实体类型方式处理的状态的变体具有 has-a 关系。

该设计可以按如下方式工作:

然而,我觉得每个属性的冗长程度和重复样板代码的数量使这样的设计变得笨拙。但是,我想不出一种通过使用模板来减少样板文件的方法。似乎应该有一种方法至少可以为actor::get_rotation()上面的“直通吸气剂”制作模板,但我不知道一种对成员函数进行参数化的方法,这似乎是你需要做的.

有没有人对像这样不那么冗长或使用更少样板的设计有想法?

0 投票
1 回答
60 浏览

c++ - 如何替换基本构造函数调用

在最近的 SO回答中,部分片段我无法理解发生了什么,

base(v)是基类的调用ctor,如果是这样,什么相当于没有using base::base

0 投票
1 回答
114 浏览

c++ - 包含自身映射的 C++ 变体

我希望能够创建一个包含 astd::map<std::string, MyVariant>作为其案例之一的变体。理想的情况是能够写出类似的东西

但这需要前向声明。

我知道之前已经问过类似的问题,例如herehere,但这些问题主要集中在 的情况下std::vector,并且由于 C++17std::vector允许使用不完整类型,而不允许使用std::map

特别是,我想知道这个答案中的定点组合器解决方案是否适用于这种情况?从该答案改编代码:

但是,如果有另一种方法可以做到这一点,我也会对此感兴趣。