【问题标题】:Converting a struct to an array将结构体转换为数组
【发布时间】:2014-11-13 07:49:41
【问题描述】:

随着编程变得越来越复杂,对结构数据执行操作的需求变得显而易见。是否有将结构类型转换为其成员数组的转换方法:

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

可以表示为:

int Bar[2];

或者更好,动态为:

vector<int> Bar;

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

【问题讨论】:

  • 为什么不在结构中保存一个数组?
  • int Bar[2] - 没有。 int Bar[3] - 是的。
  • @juanchopanza 实际的实现承载了数量惊人的成员,这些成员定义了要写入文件的项目的属性。我害怕为我的眼睛创建一堆无法读取的数据。但我也希望能够附加“特殊”属性。
  • 使用vector&lt;int&gt;,您必须将其复制到向量中以进行“序列化”操作,并从向量中复制回结构中以进行“正常”操作。您可以将结构的地址转换为int*,然后使用该指针来执行您的“序列化”操作,这将直接影响结构。顺便说一句,“没有过度使用赋值运算符”是什么意思?无论您如何表示此结构,您都必须使用相同数量的分配。老实说,您在这里的目的非常模糊。
  • 这看起来更像是std::tuple 的应用程序,它与可变参数模板联系在一起,用于编译时动态操作。您可能需要添加一个函数来将相关结构转换为std::tuple

标签: c++ arrays vector struct std


【解决方案1】:

您可以使用未命名的structs 来创建一个混合struct,其中它的成员可以被视为一个数组:

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

LIVE DEMO

但是请注意,未命名的struct 来自 C11,它不是标准的 C++ 功能。尽管 GCC 和 Clang 都支持它作为扩展。

【讨论】:

  • 联合为两种表示创建一个指向单个数据位置的指针?这非常有用!
  • 实施工作没有任何问题。 (VS2013) 这个解决方案为vector&lt;int&gt; 赋值打开了大门,将所有必要的数据附加到一个动态数组中。下一个任务是创建一个设计来处理我想的具有可变类型的结构。
【解决方案2】:

怎么样:

vector <Foo> Bar;

然后您可以添加结构的实例,然后使用类似数组的格式根据需要访问每个元素。

有关更多信息,请参阅此相关问题:

Vector of structs initialization

在重新阅读您的问题几次后,我想我误解了您的意图并回答了“错误的问题”。您可以如上所述制作一个结构数组并将其索引为一个数组,但我不认为让每个结构元素成为数组的不同元素那么简单。如果您正在寻找一个结构数组,我的回答应该会有所帮助。如果您希望将 struct 的每个元素都作为数组的元素,40two 的答案应该可以帮助您。

【讨论】:

    【解决方案3】:

    如果您的结构是 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&lt;i&gt;(tuple) 访问器要求 i 是编译时间常数。这是否值得复杂性在很大程度上取决于应用程序。

    【讨论】:

    • 我得研究一下它的实现然后回来。
    • 你想对成员们做些什么?
    • 只需遍历它们并编写一个文件。我想我可以在输出时只输出带有数据的标题,但我也想将多个结构的数据附加到文件中——可以选择动态存储额外的“成员”。编辑:无聊的东西:想象一个游戏角色。
    猜你喜欢
    • 2021-08-09
    • 2015-02-16
    • 2015-06-22
    • 2023-04-08
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多