我需要一些有关代码设计的帮助和指导。我想运行将多个变量设置为多个值的测试,而又不创建大量的嵌套循环。我得到了一个结构,其中包含这样的各种变量(仅以三个整数为例,但是真正的交易将包含更多的值,包括布尔值,双精度型等):
struct VarHolder
{
int a;
int b;
int c;
// etc..
// etc..
};
该结构传递到测试函数中。
bool TestFunction(const VarHolder& _varholder)
{
// ...
}
我想对所有在其设定范围内的变量以及所有变量组合进行测试。一种方法是为每个变量创建一个循环:
for (int a = 0; a < 100; a++)
{
for (int b = 10; b < 90; b++)
{
for (int c = 5; c < 65; c++)
{
//...
//...
//set variables
VarHolder my_varholder(a, b, c /*, ...*/);
TestFunction(my_varholder);
}
}
}
但是,这似乎效率低下,并且随着变量数量的增加而变得难以理解。有什么优雅的方法可以做到这一点?一个症结是变量将来会更改,删除一些变量,添加新变量等。因此,最好在不重写每个变量的情况下采用一些解决方案。
答案 0 :(得分:6)
使用range-v3,您可以使用cartesian_product
视图:
auto as = ranges::view::ints(0, 100);
auto bs = ranges::view::ints(10, 90);
auto cs = ranges::view::ints(5, 65);
// ...
// might be other thing that `int`
for (const auto& t : ranges::view::cartesian_product(as, bs, cs /*, ...*/))
{
std::apply(
[](const auto&... args) {
VarHolder my_varHolder{args...};
Test(my_varHolder);
},
t);
}