将一个结构体转换为数组

3
随着编程变得越来越复杂,以及需要在结构数据上执行操作的需求变得明显。是否有一种将结构体类型转换为其成员数组的转换方法,使得:
struct FooDesc Foo{
    int num_Foo;
    int num_Bar;
    int GreenFoo;
};

可以用以下方式表示:

int Bar[2];

或者更好的方式是,动态地如下所示:
vector<int> Bar;

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


为什么不在结构体中保存一个数组呢? - juanchopanza
3
int Bar[2] - 不可以。int Bar[3] - 可以。 - barak manos
@juanchopanza 实际实现承载了大量成员,定义了要写入文件的项目属性。我担心会创建一堆难以阅读的混乱数据。但我也想能够附加“特殊”属性。 - Rashid Ellis
使用vector<int>时,您需要将其复制到向量中进行“序列化”操作,然后从向量中复制回结构体进行“正常”操作。您可以将结构体的地址强制转换为 int*,然后使用该指针执行您的“序列化”操作,这将直接影响结构体。顺便问一下,“没有过多使用赋值运算符”是什么意思?无论您如何表示此结构,都必须使用相同数量的赋值。说实话,您在这里的目的非常模糊。 - barak manos
1
这更像是std::tuple的应用,它与可变参数模板结合,用于编译时动态操作。您可能需要添加一个函数将相关结构体转换为std::tuple - Jason
显示剩余3条评论
3个回答

6
您可以使用未命名的struct来创建一个混合struct,其中其成员可以被视为数组:
struct  Foo {
  union {
    struct {
      int x;
      int y;
      int z;
    };
    struct {
      int array[3];
    };
  };
};

实时演示

请注意,未命名的struct来自C11,不是标准的C++特性。 然而,它被GCC和Clang作为扩展支持。


联合体为两种表示创建了一个指向单个数据位置的指针?这非常有用! - Rashid Ellis
实现过程没有出现任何问题。(VS2013)这个解决方案为使用vector<int>进行附加所有必要数据到一个动态数组打开了大门。下一个任务是创建一个设计来处理具有可变类型的结构。 - Rashid Ellis

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)访问器要求i是一个编译时常量。是否值得增加复杂性取决于应用程序。


我需要稍微研究一下它的实现并回复。 - Rashid Ellis
你想对成员做什么样的事情? - sfjac
只需遍历它们并写入文件。我想我可以在输出时输出标题和数据,但我还想将多个结构的数据附加到文件中- 并具有动态存储其他“成员”的选项。编辑:无聊的东西:想象一个游戏角色。 - Rashid Ellis

1
怎么样:
vector <Foo> Bar;

您可以添加您的结构的实例,然后使用类似数组的格式访问每个元素。有关更多信息,请参见以下相关问题:
向量结构初始化
在多次阅读您的问题后,我认为我误解了您的意图并回答了“错误的问题”。您可以像上面提到的那样制作一个结构体数组并将其索引为数组,但我不认为将每个结构体元素作为数组的不同元素是如此简单。如果您想制作结构体数组,则我的答案应该有所帮助。如果您想使您的每个结构体元素成为数组的一个元素,则40two的答案应该对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接