Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以有条件地选择分配给哪个变量吗? 基本上与C++相同,但对于C++,_C++_Variable Assignment - Fatal编程技术网

我可以有条件地选择分配给哪个变量吗? 基本上与C++相同,但对于C++,

我可以有条件地选择分配给哪个变量吗? 基本上与C++相同,但对于C++,,c++,variable-assignment,C++,Variable Assignment,最简单的方法是: 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

最简单的方法是:

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++中有什么内容允许我做下面的事情吗?< /P>
do-something-that-returns-a-lvalue = f(x);

对不起,如果它不被称为LValm,我对C++仍然比较陌生。但你们知道我的意思-分配值的目标变量。

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

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

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

(condition ? a : b) = f(x);  // reference
上述版本是在一篇评论中提出的

*(condition ? &a : &b) = f(x);  // pointer
参考版本基本上相当于下面使用helper函数的更详细示例

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);
模板
T&
有条件参考(bool pred,T&yes,T&no)无例外
{
返回pred?是:否;
}
//后来
条件参考(条件a,b)=f(x);
我的观点是,传统的
if
then
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;
}
*p = f(x);
然后,您可以在切换语句后执行此操作

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

就像你链接到的问题一样,你仍然有一个问题。你为什么需要这个?为什么您觉得编写更多可能无法阅读和维护的代码比简单的if/else条件更不优雅?但问题的核心是,在什么样的有效场景中,26个变量(后面是字母)具有相同的值

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

请阅读:

你不会因为有人在某个地方写了一本书,说这是一件好事,就去干,你去干是因为它实际上有着实实在在的好处


你当然可以写一个函数,返回一个引用并赋值给它。我该怎么做?函数的返回类型应该是什么样的?虽然它不是问题的直接答案,
fval=f(x);如果(条件)a=fval;else b=fval
对我来说更清晰,但仍然是干燥的。@Amadan我理解干燥原理,但它一直困扰着我,即使我这样做,fval对我来说仍然是一种重复。这就是为什么我称之为不雅观的原因——它看起来像是一个解决方案,但实际上不是。这让我觉得我是一个使用编号变量而不是数组的新手。如果您有
T变量[size]
,那么
vars[condition\u variable]=f(x)
。当然,最好使用
std::vector
std::array
这并不能真正解决问题。现在我要用指针变量在左侧执行switch语句。本质上是一样的。我的问题是,是否可以避免使用switch语句,并将相同的功能整合到一行中,或者是类似的内容。@thegreatjedi您可以使用5gon12eder建议的三元运算符。如果
a
b
具有相同的类型,则普通的
(条件?a:b)=f(x)可以。@aschepler老实说,我有点惊讶于它能起作用,但仔细想想,当然,它能起作用。我会记住的。这很可能就是我想要的解决方案。谢谢我接受这个答案。@thegreatjedi,那么你实际上不是在寻找两个以上的变量?当然,你可以将模式扩展到两个以上的变量
((y==1)?a:(y==2)?b:c)=f(x)
但它不能很好地扩展。@选民看到答案的可变性,除了避免“干巴巴的”之外,没有明确说明OP真正想要什么,这强烈表明“不清楚你在问什么”或“太宽”。如果你认为一个问题“太宽”或“不清楚你在问什么”,建议的程序是要求缩小或澄清问题,如果这不起作用,则将其标记为结束。这不是一个借口,因此张贴广泛或不明确的答案。也就是说,我觉得你的答案不值得否决。我在不同的程序中遇到过这样的例子,我想做的就是“选择要分配给哪个变量”。我知道有多种方法可以选择使用哪个变量的值,所以我很自然地想知道反之亦然,因为我经常遇到需要它的情况。对我来说,当不同的情况有明显不同的代码时,应该使用switch case语句之类的语句,而不是重复一条语句n次。我不是要在此时此地解决一个问题,而是要学习我可以使用的技术。谢谢你的回答!我认为这一点尤其值得一提,尽管不幸的是它仅限于编译时。可惜我不能选择多个答案。