【问题标题】:c++ - conditional assignment of const, without ternary?c++ - const的条件赋值,没有三进制?
【发布时间】:2022-01-11 17:56:56
【问题描述】:

假设我想根据依赖于条件的复杂计算分配一个 const 变量。

如果情况很简单,我可以这样做:

const int N = myBool ? 1 : 2;

但它更像

const int N = myBool ? <lengthy calculation> : <other lengthy calculation>;

我正在做的是这个,但我想要更干净的东西:

int N_nonconst;
if (myBool) {
  N_nonconst = <lengthy calculation>;
}
else {
  N_nonconst = <other lengthy calculation>;
}
const int N = N_nonconst;

显然,我也可以这样做:

int possibility1 = <lengthy calculation>;
int possibility2 = <other lengthy calculation>;
const in N = myBool ? possibility1 : possibility2;

但我实际上只想执行其中一项冗长的计算。

如果我要扩展语言,我会考虑做出类似const_deferredAssignment 的声明:

const_deferredAssignment int N;
if (myBool) {
  N = <...>;
}
else {
  N = <...>;
}

我也可以将这些计算封装在函数/方法中,但它们使用了一堆局部变量,所以这将是一个相当冗长的函数调用。

【问题讨论】:

  • “相当冗长的函数调用”会有什么问题?
  • 没什么技术性,只是比我希望的更冗长。
  • 顺便说一句,Swift 允许您声明一个由 if/else 块立即设置的未初始化的 const var。我希望 C++ 做到这一点。

标签: c++ conditional-statements constants variable-assignment


【解决方案1】:

您可以将每个计算包装在 lambda 中,并捕获局部变量以减少其参数的冗长

{
    // ...

    auto firstFunc = [&]() -> int { ... };
    auto secondFunc = [&]() -> int { ... };
    
    const int N = myBool ? firstFunc() : secondFunc();
}

这样,实际上只执行了两个函数中的一个。

【讨论】:

  • 我喜欢这个,它有一定的优雅。
  • 谢谢!我不确定 Lambda 是否存在于我正在使用的 C++ 风格中,但我会试一试。我希望我可以选择两个答案,因为您和肖恩的答案非常相似并且同时出现。我正在选择你的。
【解决方案2】:

您可以将冗长的计算移到单独的函数中:

int lengthCalculation()
{
  if(myBool)
  {
    return <lengthy calculation>;
  }
  else
  {
    return <other lengthy calculation>;
  }
}

const int N = lengthCalculation();

如果您不想创建可以使用本地 lambda 的单独函数:

const int N = [&]()
{
  if(myBool)
  {
    return <lengthy calculation>;
  }
  else
  {
    return <other lengthy calculation>;
   }
}();

【讨论】:

  • 谢谢!我不确定 Lambda 是否存在于我正在使用的 C++ 风格中,但我会试一试。我希望我可以选择两个答案,因为您的答案和 Cory 的答案非常相似并且同时出现。我选择Cory's。你看起来在声誉方面做得很好!再次感谢。
【解决方案3】:

你可以尝试使用

SWITCH(myBool) 
{

Case 0 : first_lengthy_calculation

         Break;

Case 1 : second_lengthy_calculation

         Break;

}

【讨论】:

  • 感谢您的回答,但我不确定这如何解决将结果分配给 const 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2014-08-16
  • 2013-04-19
  • 2012-12-15
  • 1970-01-01
  • 2013-10-25
相关资源
最近更新 更多