将结构转换为数组

时间:2014-09-18 20:22:36

标签: c++ arrays vector struct std

随着编程变得更加复杂,对结构数据执行操作的需求变得可见。是否有转换方法将结构类型转换为其成员数组,以便:

struct FooDesc Foo{
    int num_Foo;
    int num_Bar;
    int GreenFoo;
};

可以表示为:

int Bar[2];

或者更好,动态地:

vector<int> Bar;

目标是将数据结构转换或重新表示为可迭代的形式,而不过度使用赋值运算符。

3 个答案:

答案 0 :(得分:4)

您可以使用未命名的struct制作混合struct,其成员可被视为数组:

struct  Foo {
  union {
    struct {
      int x;
      int y;
      int z;
    };
    struct {
      int array[3];
    };
  };
};

LIVE DEMO

但是请注意,未命名的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}是一个编译时常量。这是否值得复杂,在很大程度上取决于应用程序。