变体数据类型是包含其他数据类型的标记联合。它是[ocaml]中的标准数据类型,通常用于经典Microsoft Windows [com]编程中的语言([c ++]和[vb6])之间的互操作调用。它也存在于使用其他名称的其他语言中,例如[区别联盟]或[代数数据类型]的更一般概念
考虑以下代码: #包括 A类{}; B 类{}; 模板 bool constexpr is_of(const Variant& 变体) { 返回 std::visit( ...
我有一个可能重复类型的 std::variant,我想增加该变体的活动索引。 这是一个演示我想做的事情的示例: 模板 我有一个 std::variant 可能重复的类型,我想增加变体的活动索引。 这是一个演示我想做的事情的示例: template <typename... Ts> bool update_variant(std::variant<Ts>& v, std::tuple<work_generator<Ts>>& gen) { return visit_with_index([&]<size_t Index /* the active index */>(auto& e) { if (e.done()) { // we are done with e constexpr size_t next_index = Index + 1; if constexpr (next_index == sizeof...(Ts)) { // no more other work to do return false; } else { // still have other work to do so we move on to the next variant alternative v.emplace( std::in_place_index_t<next_index>{}, std::get<next_index>(gen).create_worker() ); return true; } } else { // do some work on e, so e gets closer to the done state e.do_some_work(); return true; } }, v); } 为了实现这一点,我似乎需要类似于上面visit_with_index的东西,它为我提供当前索引作为编译时值。 除了上面编写我自己的 visit_with_index 版本(实际上是编写我自己的 std::visit 版本)之外,还有其他更简单的方法可以实现我想要的功能,而无需通过索引执行多次查找吗? 我会在索引上使用 visit “直接”。 第一 template <typename... Ts> auto get_index_variant(const std::variant<Ts...>& v) { return [&]<std::size_t...Is>(std::index_sequence<Is...>){ using Ret = std::variant<std::integral_constant<std::size_t, Is>...>; std::array<Ret, sizeof...(Is)> a = {{Ret{std::integral_constant<std::size_t, Is>{}}...}}; return a[v.index()]; }(std::make_index_sequence<sizeof...(Ts)>()); } 然后 std::visit([&](auto index){ // index() is constexpr // ... }, get_index_variant(v)); 演示
std::变体反射。我如何知道分配了哪种类型的值 std::variant?
我有一个名为 foo_t 的类,它有一个名为 bar 的成员,它可以是 std::string、int、std::vector 等类型中的任何一种。我希望能够询问 foo_t 是哪种类型 bar哈...
Delphi 2009 无法将 '' 与 333 进行比较,而 Delphi 6 可以:“无法将类型 (UnicodeString) 的变体转换为类型 (Double)”在 Delphi 2009
我正在尝试将带有 TdxDBGrid 的 Delphi 6 应用程序迁移到 Delphi 2009,暂时我想保留 TdxDBGrid,因为它具有 TcxGrid 没有的功能(我们正在迁移到 Tc...
有一个问题,在这 2 种变体产品上,单击 100 毫升选项时应该会显示“在梅西百货购买”。仅当您访问包含硬编码变体的 URL 时才会出现这种情况。 这是我现在的生活...
如何在 boost::variant<T> 中存储引用而不是复制对象?
假设我有一个 boost::variant 定义为 boost::variant 形状。现在,如果我创建一个 Point 类的对象 Point p 并将其存储为 shape = p 我正在做的事情...
在另一个 std::variant 的替代品中构建类型指针的 std::variant
我得到了几种类型的 std::variant 。我想编写一个特征,给出第一个类型的指针的另一个 std::variant 。 使用 MyVariant = std::variant; ...
我试图通过给它一个可以构造其 T 之一的值来理解 std::variant 的构造。参考文献说 std::变体::变体 ... (4)
将 unique_ptr 推入变体 unique_ptr 的向量中
我正在玩c++并遇到这个问题 如果我有一个看起来像这样的变体: 使用水果=变体 和一个变量的 unique_ptr 向量: 矢量 我正在玩 C++ 并遇到这个问题 如果我有一个如下所示的变体: using Fruit = variant<Apple, Tomato> 以及变体的 unique_ptr 向量: vector<unique_ptr<Fruit>> fruits 如何将 unique_ptr<Apple> 移动到 fruits 向量中? 这是一段示例代码: #include <variant> #include <memory> using namespace std; struct Apple {}; struct Tomato {}; using Fruit = variant<Apple, Tomato>; int main() { vector<unique_ptr<Fruit>> fruits; unique_ptr<Apple> apple = make_unique<Apple>(); fruits.push_back(unique_ptr<Fruit>(move(apple))); // error here } 在致电 push_back 时,我收到此错误: No matching conversion for functional-style cast from 'remove_reference_t<unique_ptr<Apple, default_delete<Apple>> &>' (aka 'std::unique_ptr<Apple>') to 'unique_ptr<Fruit>' (aka 'unique_ptr<variant<Apple, Tomato>>') 如果我将行更改为fruits.push_back(unique_ptr<Apple>(move(apple)));,我会收到此错误: No matching member function for call to 'push_back' 如果我将其更改为fruits.emplace_back(unique_ptr<Apple>(move(apple)));,则不会发生错误。 那么使用 emplace_back 是正确的选择吗?为什么会出现这个错误?我假设这是因为我无法将 unique_ptr<VariantMemberType> 投射到 unique_ptr<VariantType>? Fruit 与 Apple 无关。 Fruit 可能包含 Apple。无法将指向 Apple 的指针转换为指向 Fruit 的指针,就像无法将指向 int 的指针转换为指向 std::set<int> 的指针一样。最好的方法是创建一个新的 Fruit 对象,并将 apple 指向的值移动到新的 Fruit 中。 #include <memory> #include <variant> #include <vector> struct Apple {}; struct Tomato {}; using Fruit = std::variant<Apple, Tomato>; int main() { std::vector<std::unique_ptr<Fruit>> fruits; std::unique_ptr<Apple> apple = std::make_unique<Apple>(); fruits.push_back(std::make_unique<Fruit>(std::move(*apple))); } 请注意,我们现在用 Fruit 创建一个新的 std::make_unique 并移动 apple 指向的对象的值,而不是移动指针。值得注意的是,您现在将有一个由 Apple 指向的移自 apple。您需要其生命周期结束,您需要手动重置指针。
我需要将variant转换为另一个variant,其中ftypeN是使用typeN参数调用的函数fn()的返回类型,遵循以下...
带有单个模板参数的 `std::variant` 的目的是什么?
在此页面的示例中:https://en.cppreference.com/w/cpp/utility/variant 有一个带有单个模板参数的 std::variant: std::variant x("abc"); 自从
我需要在运行时按索引访问 std::tuple 中的值。为此,我编写了一个函数,该函数返回一个 std::variant,其类型与为指定索引初始化的类型相同。实施
下面是我的代码: #包括 #包括 #包括 #包括 结构忽略 { 模板 void 运算符()([[maybe_unu...
我在自定义目录列表循环方面遇到一些问题。 目标:在目录页面上列出简单产品和一些变体产品(取决于属性); 我创建了一个自定义
我正在尝试使用雪花暂存 CSV 文件将雪花副本运行到命令中。 我的命令看起来像这样 COPY INTO test_table FROM @my_stage FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1) PURGE ...
如何使用 Shopify GraphQL 检索特定折扣代码适用的产品变体 ID? 这是我的 GraphQL 查询 const query = `查询 codeDiscountNodeByCode($code: String!) { ...
我正在尝试访问 std::variant 中保存的类的方法。不幸的是它抛出以下错误: 类“std::variant”没有名为“function”的成员 代码: A类{ 私人的: ...
在我的模拟引擎中,我有一个SimulationObject 模板,专门用于使用标签的不同类型的SimulationObjects。我还有一个 SimulationObjects 类型,列出了所有
我有一个模板类,它采用 std::variant 作为模板参数: 模板 X级 { }; X> x; 我想添加一个约束,使 T 成为 der...
C++ 中 auto 函数的 std::variant 自动返回类型推导
对于此代码: 结构体A{}; 结构体B{}; 自动 f() -> std::variant { 如果(真)返回A(); 返回 B(); } 编译器是否可以自动将返回类型推断为...