我可以有条件地选择要分配的变量吗?

时间:2015-12-11 01:25:42

标签: c++ variable-assignment

基本上与this question相同,但对于C ++。

最简单的方法是:

if (condition) {
    a = f(x);
} else {
    b = f(x);
}

虽然这符合我的需求,但我一直不得不重复键入f(x)两次,更不用说在只执行一行时将代码扩展到这么多行。如果我有一组更大的目标变量可供选择,该怎么办?

switch(condition variable) {
case 1:
    var1 = f(x);
    break;
case 2:
    var2 = f(x);
    break;
...
case y:
    vary = f(x);
    break;
}

这看起来非常不优雅。

C ++中是否有任何内容允许我执行以下操作?

do-something-that-returns-a-lvalue = f(x);

请原谅我,如果它不被称为左值,我对C ++来说还是比较新的。但你们知道我的意思 - 为目标变量赋值。

4 个答案:

答案 0 :(得分:8)

您可以形成一个引用或指向要分配的变量的指针。

(condition ? a : b) = f(x);  // reference

以上版本由aschepler在评论中提出。

*(condition ? &a : &b) = f(x);  // pointer

参考版本基本上等同于使用辅助函数的以下更详细的示例。

template <typename T>
T&
conditional_reference(bool pred, T& yes, T& no) noexcept
{
  return pred ? yes : no;
}

// And then later

conditional_reference(condition, a, b) = f(x);

我的观点是,传统的if然后else控件流可能仍然是代码清晰度方面的最佳选择。

如果赋值的来源是一个比f(x)更复杂的表达式,则可以将其结果存储在临时变量中,然后仅在条件中分配该变量。 C ++ 11移动语义使得在许多情况下可以接受这种临时使用。

答案 1 :(得分:6)

如果你可以决定在编译时分配哪个变量,那么你就可以摆脱这种非常干净且零开销的方法:

std::get<constexpr_indexer()>(std::tie(var1, var2, var3, var4)) = f(x);

std::getstd::tie

答案 2 :(得分:2)

您可以在switch语句中指定一个指针变量(例如double * p)。

switch(condition variable) {
case 1:
    p = & var1;
    break;
case 2:
    p = & var2;
    break;
...
case y:
    p = & vary;
    break;
}

然后你可以在切换语句后执行此操作。

*p = f(x);

答案 3 :(得分:0)

与您关联的问题一样,您仍然拥有XY problem。你为什么需要这个?为什么你觉得编写的代码可能比简单的if / else条件更难以理解和不可维护?但问题的核心是,在有效的情况下你会有26个(跟随字母表)变量具有相同的值吗?

除非你有一个类似于原始问题的场景(二进制搜索树),否则只需坚持使用一个变量。

请阅读DRY unrelated, but nearly identical, code

  

你不做干,因为有人在一本书的某个地方写了它做得很好,你做干,因为它确实带来了实实在在的好处。