我有一个函数,它需要三个结构和小部件列表。我想将所有这些小部件与结构中的特定字段链接起来,然后进行相应的处理。
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));
}
}
我不确定上一个示例中的类型(将其视为伪代码) - 我有两个问题:
我想说你应该重新考虑设计:(