将lambda传递给三元运算符的第二个子句

时间:2017-09-17 15:21:38

标签: c++ c++11 lambda ternary-operator

我正在尝试使用lambda进行三元运算符。以下是我想要投入三元运算的逻辑

if (boolean_condition_var == false) {
  RandomMethod();
}

// From here some logic to execute
int i = 0;
// blah blah logic

以下是我在阅读this链接后尝试使其工作的方式。

boolean_condition_var == false ? RandomMethod() : std::function<void(void)>([this](){
    // execute some logic here
    int i = 0;
    //blah blah logic
});

但是我收到以下错误:

问题:

error: left operand to ? is void, but right operand is of type 'std::function<void ()>'
boolean_condition_var == false ? RandomMethod() : std::function<void(void)>([this](){ int i = 0; });

问题:
如何将lambda传递给我的三元运算符的第二个子句?

2 个答案:

答案 0 :(得分:1)

  

如何将lambda传递给我的三元运算符的第二个子句?

使用逗号运算符?

boolean_condition_var == false 
       ? (RandomMethod(), 0)
       : (std::function<void(void)>([this](){ /*...*/ })(), 0);

或者,我想更好,

std::function<void(void)> logicElse { [this](){ /*...*/ } };

boolean_condition_var == false 
       ? (RandomMethod(), 0)
       : (logicElse(), 0);

答案 1 :(得分:1)

由于您没有调用lambda,因此创建它没有多大意义。你要做的是等同于

boolean_condition_var ? void(0) : RandomMethod();

另一方面,如果要调用lambda,请使用call运算符:

boolean_condition_var? ([this](){...your code...}) ( ) : RandomMethod();
//                                                  ^
//                                                  |
//--------------------------------------------------+

没有必要向std::function施放任何内容。

这里会更欢迎一个简单的if-then-else声明。

第三方面,如果你希望你的三元运算符返回一个可调用的,你可能需要像

这样的东西
 using voidf = std::function<void(void)>;

 auto result = boolean_condition_var?
     voidf([this](){...your code...}):
     voidf([this](){RandomNethod();});

 .... result();

按值捕获boolean_condition_var并将条件移动到(现在单个)lambda中可能更具可读性和效率。