随着编程变得更加复杂,对结构数据执行操作的需求变得可见。是否有转换方法将结构类型转换为其成员数组,以便:
struct FooDesc Foo{
int num_Foo;
int num_Bar;
int GreenFoo;
};
可以表示为:
int Bar[2];
或者更好,动态地:
vector<int> Bar;
目标是将数据结构转换或重新表示为可迭代的形式,而不过度使用赋值运算符。
答案 0 :(得分:4)
您可以使用未命名的struct
制作混合struct
,其成员可被视为数组:
struct Foo {
union {
struct {
int x;
int y;
int z;
};
struct {
int array[3];
};
};
};
但是请注意,未命名的struct
来自C11,而不是标准的C ++功能。虽然GCC和Clang也支持它作为扩展。
答案 1 :(得分:2)
怎么样:
vector <Foo> Bar;
然后,您可以添加结构的实例,然后根据需要使用类似数组的格式访问每个元素。
有关详细信息,请参阅此相关问题:
Vector of structs initialization
几次重读你的问题后,我想我误解了你的意图并回答了“错误的问题”。您可以如上所述创建一个结构数组并将其作为数组索引,但我不认为它使每个struct元素成为数组的不同元素非常简单。如果你想制作一系列结构,我的答案应该有所帮助。如果您希望将结构的每个元素作为数组的一个元素,那么两个答案应该可以帮助您。
答案 2 :(得分:2)
如果您的结构是POD,那么您可以考虑使用std :: tuple而不是结构。然后,您可以使用各种模板工具来处理元组的成员。
这是一个打印元组元素的简单示例 - 使用boost :: fusion :: tuple而不是std :: tuple,因为它有更多的元组操作工具可供使用:
#include <boost/fusion/tuple.hpp>
#include <boost/fusion/include/for_each.hpp>
#include <iostream>
struct Printer {
template<typename T>
void operator()(const T &t) const {
std::cout << t << std::endl;
}
};
int main(int argc, const char * argv[])
{
boost::fusion::tuple<int, int, int, int, float> t =
boost::fusion::make_tuple(3, 5, 1, 9, 7.6f);
boost::fusion::for_each(t, Printer());
return 0;
}
您可以将这些包含在具有结构的联合中,但是您希望进行一些测试以确保正确的对齐协议。
好处是这些操作非常快 - 大多数工作都是在编译时完成的。缺点是您无法使用常规控制结构,例如使用运行时索引进行索引 - 您必须构建一个抽象层,因为普通get<i>(tuple)
访问器需要{{1}是一个编译时常量。这是否值得复杂,在很大程度上取决于应用程序。