变体数据类型是包含其他数据类型的标记联合。它是[ocaml]中的标准数据类型,通常用于经典Microsoft Windows [com]编程中的语言([c ++]和[vb6])之间的互操作调用。它也存在于使用其他名称的其他语言中,例如[区别联盟]或[代数数据类型]的更一般概念
unsafe,`noexcept`和无头的访问sTD ::variant`
STD:: variant提供以下访问功能: std :: get_if:将指针换成变体,返回指针转换为替代方案。 模板 auto* std :: get_if(std ::
我有一本工作簿,里面有很多我已经使用多年的代码。其中一个工作表包含用于创建验证列表并使用文件夹名称填充验证列表的代码...
将 std::variant 转换为具有类型超集的另一个 std::variant
我有一个 std::variant,我想将其转换为另一个具有其类型超集的 std::variant。有没有一种方法可以让我简单地将一个分配给另一个? 模板...
我有一个大型 VB6 项目,其中很多变量没有显式定义的类型,因此它们自动默认为 Variant 类型。手动找到所有这些是一项艰巨的任务,那么有没有...
我正在努力解决这段代码的奇怪行为。问题是这个片段的输出是双倍的。但我们在 lhs 中有 int 。我挖了一段时间,发现编译器把垃圾加倍了......
考虑以下代码: #包括 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...