本质上与此问题相同,但对于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++.但是你们知道我的意思 - 为其分配值的目标变量.
您可以形成一个引用或指向要分配的变量的指针.
(condition ? a : b) = f(x); // reference
上述版本由aschepler在评论中提出.
*(condition ? &a : &b) = f(x); // pointer
参考版本基本上等同于使用辅助函数的以下更详细的示例.
templateT& 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移动语义使得在许多情况下可以接受这种临时使用.
如果您可以在编译时决定分配哪个变量,那么您可以使用这种非常干净且零开销的方法:
std::get(std::tie(var1, var2, var3, var4)) = f(x);
std::get
, std::tie