【问题标题】:Can I substitue C++ ternary operator for if in this case?在这种情况下,我可以用 C++ 三元运算符代替 if 吗?
【发布时间】:2021-01-13 05:53:53
【问题描述】:

我有以下块:

int i = 0;
std::apply([&](auto &&... args) mutable {
    ((ef = (i++ == id) ?
           args.modifyEffectVec(ef, arr) : ef), ...);
}, EffectsTuple);

i++==id 时执行:args.modifyEffectVec(ef, arr)。我想在发生这种情况时记录下来,所以我知道它发生在哪个 i 上。我试过了

int i = 0;
std::apply([&](auto &&... args) mutable {
    ((ef = (i++ == id) ?
           {
            ALOGV(TAG, "modifying effect for id %d", id);
            args.modifyEffectVec(ef, arr);
           } : ef), ...);
}, EffectsTuple);

但我发现Why ternary operator does not support blocks?

我不确定如何用这个三元组代替 if,因为它发生在这个叫做折叠表达式的东西中

【问题讨论】:

  • 与其把它变成一个块,为什么不把它放到它自己的 lambda 中并调用它呢?它可以进行日志调用并执行这段代码。
  • 非常多毛,但我认为逗号运算符可以在这里工作:/* cond */ ? (ALOGV(TAG, "modifying effect for id %d", id), args.modifyEffectVec(ef, arr)) : ...。也就是说,代码已经很复杂了,我认为如果将std::apply(...) 提取到一个新函数中会更容易阅读。

标签: c++ c++17


【解决方案1】:

C++ 中有一个 表达式族,允许在其中嵌入任意数量的语句。它是 lambda 表达式。所以如果你想在你的折叠中执行几个语句,你总是可以将它们包装在一个 lambda 中,并立即在折叠中调用它。

int i = 0;
std::apply([&](auto &&... args) {
    ([&](auto &&) { 
         if (ef = (i++ == id)) {
            ALOGV(TAG, "modifying effect for id %d", id);
            args.modifyEffectVec(ef, arr);
         }
     } (std::forward<decltype(args)>(args)), ...);
}, EffectsTuple);

您似乎没有使用 args 在您的折叠中,但如果您使用了,则会写入额外的 lambda 以正确转发它。

【讨论】:

    【解决方案2】:

    为什么不把; 替换为,

    int i = 0;
    std::apply([&](auto &&... args) mutable {
        ((ef = (i++ == id) ?
                ALOGV(TAG, "modifying effect for id %d", id),
                args.modifyEffectVec(ef, arr);
                : ef), ...);
    }, EffectsTuple);
    

    编辑:

    “,”是一个逗号运算符,它在语句之间添加一个序列点,这样您就可以避免在其中放置一个块并且两个语句仍然会运行。

    更多内容可以在这里阅读Comma_operator

    【讨论】:

    • 如果您解释它们之间的区别,以及为什么一个有效而另一个无效,您的答案会更好。
    • @RemyLebeau 是的,这是真的,我忘了它有点晦涩:)
    【解决方案3】:

    作为替代方案,因为您只为 idth 元组参数调用函数,您可能会这样做

    std::apply([&](auto &&... args) mutable {
        auto funcs[] = {std::function{[&](){ args.modifyEffectVec(ef, arr);}...};
        ALOGV(TAG, "modifying effect for id %d", id),
    
        funcs[id]();
    }, EffectsTuple);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2021-03-26
      • 2016-09-12
      • 2016-11-07
      • 2022-08-05
      • 1970-01-01
      相关资源
      最近更新 更多