大佬教程收集整理的这篇文章主要介绍了访问 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,请注明来意。