有没有一种方法可以有条件地为c ++范围循环选择不同的初始化程序列表?

时间:2019-03-03 21:16:11

标签: c++

我想重新排列这段代码:

if (x_can_be_true) {
  for (x : {false, true}) {
    do_work(x);
  }
} else {
  do_work(false);
}

因此do_work仅被调用一次。

从概念上讲,我想这样做:

for (x : (x_can_be_true ? {false, true} : {false})) {
  do_work(x);
}

关于如何使该代码实际编译的任何建议?

编辑: do_work是实际问题的简化占位符。 这是许多代码行,这些代码取决于前几行的许多参数。 问题的目的是找到一种避免重复很多行的模式。因为这不是很好的编码习惯。 ;->

我可以使它具有许多参数的功能。或使用参数块。但是... ;->

3 个答案:

答案 0 :(得分:8)

do_work(false);
if (x_can_be_true)
    do_work(true);

这等效于您的简单示例,但可能不是您真的试图做的事情的解决方案。

答案 1 :(得分:2)

怎么样

std::set<bool> vals = {false};
vals.emplace(x_can_be_true);

for (auto x : vals)
   do_work(x);

答案 2 :(得分:0)

我更喜欢Kevin的答案。但是如果您发现这一点足够可读:

for (auto x : (x_can_be_true ? vector<bool>{false, true} : vector<bool>{false})) {
  do_work(x);
}

但是,您应该阅读当天的报价:

  

调试的难度是一开始编写代码的两倍。   因此,如果您尽可能巧妙地编写代码,   定义,不足以调试它。
  -B.W.克尼根