问题标签 [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 投票
1 回答
356 浏览

c++ - 如何用 SWIG 包装 C++17 std::variant 以在 python 中使用?

我正在尝试使用 SWIG 将一些使用 std::variant 的 C++17 代码包装在 Python 中。

我找到了这个关于包装 boost::variant 的答案(https://stackoverflow.com/a/58513139),并且我设法调整了代码,以便它可以与 std::variant 一起使用。但是,根据答案的规范,代码应该可以工作,以便“在 C++ 函数采用 boost::variant 的任何地方,我们都应该透明地接受该变体可以为该函数参数保存的任何类型”。似乎只有在使用对 std::variant 的 const 引用时才能满足此要求。例如,如果在我的 c++ 文件 dummy.cpp 我有

然后在我的 dummy.i

当我尝试从 Python 脚本中使用它时,以下工作

但是,这不会:

我得到:TypeError:在方法“foo”中,类型为“std::variant<int,double>”的参数 1。

有人知道我的 variant.i 文件中缺少什么以使其按预期工作吗?这是我拥有的文件:

这几乎是从 Flexo 的回答中逐字提取的,保存一些更改以使其与 std::variant 而不是 boost::variant 一起使用。

0 投票
1 回答
111 浏览

c++ - 我可以让 lambdas 推断出变体返回类型吗?

这主要是理论上的,因为我总是可以拼出返回类型,但我想知道是否有办法告诉 lambda 返回类型应该是 lambda 主体中所有返回的 union(std::variant)。

注意:我强烈的感觉是答案是否定的,这是不可能的,但我很好奇是否有人知道一些技巧。

注意2:使用 std::any 不符合我的要求,因为我希望在编译时知道 lambda 的返回类型,而不是在运行时(使用any_cast)。

0 投票
1 回答
398 浏览

c++ - 通过 std::visit 从 std::variant 中的可能类型返回值

我试图绕开我的头std::variantstd::visit并且我试图想出一种方法来指定我希望我的变量保存的几种类型(这将进入我的std::variant),然后通过std::visit. 考虑以下示例:

变体可以保持(在这个简化的例子中)或者intdouble。如果我只想根据类型打印一些东西(就像使用PrintType结构一样),那效果很好。

如果我想像在类中那样通过访问者检索数据SingleOperatorOverload,它只提供了一个operator()接受 int 作为参数的实现,那就可以了。但是,一旦我尝试为operator()中的每种类型std::variant(即此处int和)实现一个double,就像在AllTypesOperatorOverload结构中一样,我得到一个编译错误error: invalid conversion from '...' {aka double ...} to '...' {aka int ...},所以它似乎std::variant以不同的方式处理函数签名?

我尝试了 SFINAE,但这似乎并不能缓解问题

这现在将报告一个error: no type named 'type' in 'struct std::invoke_result<AllTypesOperatorOverload, int&>'. 有没有办法提供operator()所有类型,然后根据设置方式将它们各自的值接收到bar正确的类型foo中?我知道std::get_if<T>()这在这里可能有用,但理想情况下,除非绝对必要,否则我不想检查每种类型的长 if 语句(这是一个简化的示例,我可能希望在我的std::variant)。

0 投票
1 回答
241 浏览

c++ - 处理包含只移动类型的变体

考虑以下代码:

这是一个玩具示例,说明了我在真实代码中遇到的情况。我想简化实现,flatten(...)以便在变体中有更多类型时不那么冗长。

基本上情况是,我有一个变体,其中包含一些简单的类型和一些我想做的事情。我需要执行的操作对于所有简单类型和所有仅移动类型都相同;但是,我想不出只使用两个访问函数来处理这两种情况(简单或仅移动)的方法。例如,这是非法的 C++,但说明了我想要做什么

过去,我通过使用自定义变体转换(类似于此处实现的转换)来处理此类情况,将其转换为仅包含需要相同处理的类型的变体,然后使用 lambda 将 auto 参数作为访客; 但是,这种转换在这种情况下不起作用,因为您不能复制 unique_ptrs 并且不能制作包含引用的变体。我想我可以编写一个函数来转换为指针的变体,但我想知道是否有更简单的方法。

0 投票
1 回答
79 浏览

c++ - C++ - 形式的变体的流/cout>

我已经尝试了在流式传输变体内容时可以找到的每个片段,但在我的特定用例中似乎没有任何效果:

给定一种形式的变体,std::variant<int,std::pair<char, char>> myVar如何在myVar不明确知道myVar包含什么的情况下流式传输内容。

例如:

我用于流式传输变体的任何片段,例如

在这种情况下它会失败并返回以下错误消息:

"Invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'const std::__1::pair<char, char>')"错误---无论我尝试什么,这都是我得到的!

我无法弄清楚这段代码有什么问题。请问有人可以帮我在这里识别和解决问题吗?

像 boost 这样的第三方库是绝对不行的。

0 投票
2 回答
195 浏览

c++ - 有没有办法将 std::variant 与任意多个定义类型一起使用?

我只是在学习使用std::variant,我想声明一个类型列表,其中包含(原则上)任意许多我的用户定义类型。即,类似

但是整数N原则上可以是任何东西。

有什么办法可以做到这一点?

0 投票
1 回答
278 浏览

c++ - 如何将 TEMPLATE_TEST_CASE 与类型对一起使用?

我正在尝试将catch2 TEMPLATE_TEST_CASE用于成对的类型,即我不需要为每个测试模板化一个类型,而是需要使用一对相关的类型。我以为我可以std::variant用来存储这些对,但编译失败:error: expected primary-expression before ‘)’ token. auto outtype = std::get<0>(TestType);

对于此错误或此问题的替代解决方案,我将不胜感激。这是代码片段:

0 投票
0 回答
85 浏览

c++ - 标准::变体作为模板函数的最后一个参数,采用多个可变参数

我有以下代码:

它似乎工作正常(godbolt ,但我找不到办法让.std::variant<Ts...>xvisit

例如,当我交换参数的顺序时,我会从 clang 和 gcc 中得到无用的错误:

注意:'<lambda(const string&)>' 不是从 'std::variant<_Types ...>' 派生的

注意:候选模板被忽略:无法将 'variant<type-parameter-0-1...>' 与 '(lambda at :23:17)' 匹配

Godbolt有问题的 xvisit2。

这可以解决,还是我遇到了一些语言限制?

注意:我知道xvisit不应该返回void,这只是一个例子。

0 投票
1 回答
127 浏览

c++ - 带有可变参数模板的变体

对不起,如果这个案例相当复杂,但我希望它可以帮助人们更好地理解现代 c++ 的用法。所以我想让这段代码工作。它应该为单个整数类型和变体类型生成特殊的 lambda,用于计算硬静态转换为单一类型或软变体转换为通用类型的术语序列,而这些术语将被使用。我添加了描述我在这段代码中真正尝试做的事情的注释。

0 投票
1 回答
122 浏览

c++ - 检查变体在编译时是否具有价值

不能variant.index()在 constexpr 语句中使用,因此需要迭代变体并返回true,如果它可以转换为某种类型,或者false它是 emtpy 或包含零值。试试这个代码,但似乎索引序列不是可变参数类型并且 ... 运算符在这种情况下不可用。