垂直操作结构数据

问题描述 投票:0回答:1

我有一个函数,它需要三个结构和小部件列表。我想将所有这些小部件与结构中的特定字段链接起来,然后进行相应的处理。

struct SomeStruct { QString first; QString second; QString third; ... };
void manipulateData(const QList<SomeObject*>& list, const SomeStruct& a, const SomeStruct& b, const SomeStruct& c)
{
   
}

我能做的就是使用以下形式的样板代码:

list[0]->setValue(a.first);
list[0]->setData(b.first + c.first);
list[1]->setValue(a.second);
list[1]->setData(b.second + c.second);
... (maybe more for each)

但我试图做得更好一点,所以我最初的想法是创建一个易于使用的结构列表:

void manipulateData(const QList<SomeObject*>& list, const SomeStruct& a, const SomeStruct& b, const SomeStruct& c)
{
struct TempStruct { SomeObject* obj; QString a; QString b; QString c; };
QList<TempStruct> tempList = {
 {list[0], a.first, b.first, c.first},
 {list[1], a.second, b.second, c.second},
 ...
}
for(const auto& item: tempList)
{
 item.obj->setValue(item.a);
 item.obj->setData(item.b + item.c);
}
}

这样可以更轻松地将新行添加到我的结构列表中。

我仍然遇到的问题是,它仍然不是最好的主意,因为我必须重复单词“a.first,b.first,c.first”。只要用某种“方式”填充它即可检索结构体“SomeStruct”中的“第一”、“第二”、“第三”。所以最后,我希望我的结构看起来(并填充)像这样:

void manipulateData(const QList<SomeObject*>& list, const SomeStruct& a, const SomeStruct& b, const SomeStruct& c)
{
struct TempStruct { SomeObject* obj; int getter}; //not sure about the type of getter
QList<TempStruct> tempList = {
 {list[0], &a.first - &a}, //diff in memory place?
 {list[1], &a.second - &a},
 ...
}
for(const auto& item: tempList)
{
 item.obj->setValue(*(&a+item.getter));
 item.obj->setData(*(&b+item.getter) + *(&c+item.getter));
}
}

我不确定上一个示例中的类型(将其视为伪代码) - 我有两个问题:

  1. 可以安全地假设 &c + &(b.second)-&b=&(c.second) 吗?
  2. 有没有更好的解决方案,也许更清晰?

我已经对问题1做了一些解释(我的理解正确吗?) Explanation of question 1

c++ struct
1个回答
0
投票

我想说你应该重新考虑设计:(

© www.soinside.com 2019 - 2024. All rights reserved.