【发布时间】:2023-03-30 01:28:01
【问题描述】:
我有以下结构:
struct myHandler
{
bool test1;
bool test2;
...
bool test400;
};
其中有大约 400 个测试值。所以目前我有以下功能:
static inline void DoSomething(myHandler& hdler, int test, bool passed)
{
#define SETTEST(a,b,c) case b: a.test##b=c;
switch (test)
{
SETTEST(hdler, 1, passed)
SETTEST(hdler, 2, passed)
...
SETTEST(hdler, 400, passed)
}
#undef SETTEST
};
我显然想摆脱重复的代码,因为有很多测试。所以我尝试了以下两种选择: 选项1:
static inline void DoSomething(myHandler& hdler, int test, bool passed)
{
#define SETTEST(a,b,index,c) if(index==b) a.test##b=c;
for(i = 1; i <= 400; ++i)
{
SETTEST(hdler, test, i, passed)
}
#undef SETTEST
};
显然,这不会编译,因为当它使用 ## 连接时,它需要字面上的“测试”。不知道如何或是否可以解决这个问题。
选项2:
template<typename FUNCTION>
inline void setTest(FUNCTION f) {
for (int i = 1; i <= 5; ++i) {
f(i);
}
};
static inline void DoSomething(myHandler& hdler, int test, bool passed
{
setTest([&](const int testNum) {
if(test == testNum) {
hdler.test##testNum = passed;
}
});
};
显然 option2 也不会编译,我不知道如何使用某种动态形式访问结构的成员。现在,对实际结构进行了一些更改,可以轻松解决这个问题,但是修改结构不是一种选择,因为它是通过其他一些方法形成的,这只是描述我的问题的示例代码。我只想知道是否有一种方法可以做我错过的我想要实现的目标(不修改结构)。真的,我倾向于选项 2,但是从我所阅读的内容来看,无法动态连接以访问成员。任何帮助表示赞赏。
【问题讨论】:
-
创建 2 种方法将丑陋的结构转换为
bitset/array/vector。 -
最好的选择是摆脱这个怪物并使用矢量。如果出于某种原因必须使用此结构,请使用 boost::preprocessor 库来消除重复。
-
myLittleVector[indexing] = isMagic;
-
克罗姆。我的小向量。下一步是什么?卡雷熊?
-
@n.m.这种结构可能是有原因的。实际上,我正在研究硬件(远程,通过以太网访问)使用类似的东西的项目..但我们使用了一个带有开放数组的结构..