我可以有条件地选择分配给哪个变量吗?
Can I conditionally choose which variable to assign to?
与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++ 还是比较陌生。但是你们知道我的意思 - 给目标变量赋值。
如果您可以在编译时决定分配给哪个变量,那么您就可以使用这种非常干净且零开销的方法:
std::get<constexpr_indexer()>(std::tie(var1, var2, var3, var4)) = f(x);
您可以形成指向要分配的变量的引用或指针。
(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 移动语义使得在许多情况下可以接受此类临时对象的使用。
您可以在 switch 语句中分配一个指针变量(例如 double * p
)。
switch(condition variable) {
case 1:
p = & var1;
break;
case 2:
p = & var2;
break;
...
case y:
p = & vary;
break;
}
然后你可以在switch语句之后做这个。
*p = f(x);
与您链接到的问题一样,您还有一个 XY problem。你为什么需要这个?为什么您觉得编写更多可能不可读和不可维护的代码不如简单的 if/else 条件那么优雅?但问题的核心是,在什么有效场景下,你会有 26 个(跟在字母表后面)具有相同值的变量?
除非您遇到与原始问题(二叉搜索树)类似的情况,否则请坚持使用一个变量。
请阅读DRY unrelated, but nearly identical, code:
You don't do DRY because someone wrote it in a book somewhere that it's good to do, you do DRY because it actually has tangible benefits.
与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++ 还是比较陌生。但是你们知道我的意思 - 给目标变量赋值。
如果您可以在编译时决定分配给哪个变量,那么您就可以使用这种非常干净且零开销的方法:
std::get<constexpr_indexer()>(std::tie(var1, var2, var3, var4)) = f(x);
您可以形成指向要分配的变量的引用或指针。
(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 移动语义使得在许多情况下可以接受此类临时对象的使用。
您可以在 switch 语句中分配一个指针变量(例如 double * p
)。
switch(condition variable) {
case 1:
p = & var1;
break;
case 2:
p = & var2;
break;
...
case y:
p = & vary;
break;
}
然后你可以在switch语句之后做这个。
*p = f(x);
与您链接到的问题一样,您还有一个 XY problem。你为什么需要这个?为什么您觉得编写更多可能不可读和不可维护的代码不如简单的 if/else 条件那么优雅?但问题的核心是,在什么有效场景下,你会有 26 个(跟在字母表后面)具有相同值的变量?
除非您遇到与原始问题(二叉搜索树)类似的情况,否则请坚持使用一个变量。
请阅读DRY unrelated, but nearly identical, code:
You don't do DRY because someone wrote it in a book somewhere that it's good to do, you do DRY because it actually has tangible benefits.