程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了访问 std::variant 中的结构成员大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决访问 std::variant 中的结构成员?

开发过程中遇到访问 std::variant 中的结构成员的问题如何解决?下面主要结合日常开发的经验,给出你关于访问 std::variant 中的结构成员的解决方法建议,希望对你解决访问 std::variant 中的结构成员有所启发或帮助;

我有一个 std::variant,它有两个不同的结构作为替代。 现在我需要用一个替代方案的数据填充它(我在运行时知道),但它必须以某种方式,可以单独在结构中写入元素。 显然,这行不通:

formState

还有其他方法可以实现这一目标吗?也许是一种方法,如果我知道我想要写入的替代方案,告诉变体它具有哪种结构或类似的结构?

我能想到的唯一方法是为变体的内存空间创建一个强制引用并使用它来写入它。问题是这不使用变体的方法,因此不会自动设置索引。以相同的方式设置索引也很困难,因为索引的大小因不同的变体而异(有时是 1 个字节,有时是 8 个字节):

struct ContainerOne {
    uint8_t x;
};

struct ContainerTwo {
    uint8_t y;
    uint8_t z;
};

std::variant<ContainerOne,ContainerTwo> ContainerCollection;                   // CHOICE
ContainerCollection.x = 20;   // Error

或者有没有办法找出索引的大小?

解决方法

阅读std::get

你的代码变得像 smt

struct ContainerOne {
    uint8_t x;
};

struct ContainerTwo {
    uint8_t y;
    uint8_t z;
};
int main()
{   
    std::variant<ContainerOne,ContainerTwo> ContainerCollection; 
    ContainerCollection = ContainerOne{1};
    std::get<ContainerOne>(ContainerCollection).x = 2;
    std::cout << std::get<ContainerOne>(ContainerCollection).x;
    return 0;
}

@H_674_32@PS 而且你必须记住,在 std::variant 中,如果你没有明确指定结构的类型(你调用一个空的构造函数),那么变量默认初始化 第一种类型的构造函数,所以在你的情况下它将ContainerOne

,

我不确定,但您似乎想使用 std::get。

struct ContainerOne {
    uint8_t x = 0;
};

struct ContainerTwo {
    uint8_t y = 0;
    uint8_t z = 0;
};

int main() {


std::variant<ContainerOne,ContainerTwo> ContainerCollection;

ContainerCollection = ContainerOne();

std::get<ContainerOne>(ContainerCollection).x = 1;

ContainerCollection = ContainerTwo();

std::get<ContainerTwo>(ContainerCollection).y = 2;
std::get<ContainerTwo>(ContainerCollection).z = 3;

}
,

您需要在运行时进行某种调度,以根据活动元素(成员函数 index())的返回索引选择合适的值。例如。如果我们为每种类型提供选择并使用 std::get

#include <iostream>
#include <cstdlib>
#include <variant>

struct ContainerOne {
    uint8_t x;
};

struct ContainerTwo {
    uint8_t y;
    uint8_t z;
};
              
using ContainerType = std::variant<ContainerOne,ContainerTwo>;

void init_ContainerOne(ContainerType& v) {
    std::get<ContainerOne>(v).x = 20;
    std::cout << __PRETTY_FUNCTION__ << "\n";
}

void init_ContainerTwo(ContainerType& v) {
    std::get<ContainerTwo>(v) = {};
    std::cout << __PRETTY_FUNCTION__ << "\n";
}

decltype(&init_ContainerOnE) dispatch[] =  { init_ContainerOne,init_ContainerTwo };


int main()
{
   std::variant<ContainerOne,ContainerTwo> container  = ContainerOne{};
    
   dispatch[container.index()](container);
}

C++17 提供了 std::visit,使基础设施的构建更简单

大佬总结

以上是大佬教程为你收集整理的访问 std::variant 中的结构成员全部内容,希望文章能够帮你解决访问 std::variant 中的结构成员所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。