c++ - 你能用折叠表达式实现 fn(x1 ^ fn(x0)) 吗?

是否可以使用折叠表达式实现以下目的?

template<class... Args>
auto foo(Args... args)
{
    //calling foo(x0, x1, x2) should be exactly equivalent to
    //calling fn(x2 ^ fn(x1 ^ fn(x0)))
}

最佳答案

您可以向 foo 添加一个强制参数,并检查您是否有其他带有 constexpr-if 的参数。

编辑:我不小心错过了它应该是折叠表达式的要求,所以这使用了包扩展和递归。

template <class T, class... Args>
constexpr auto foo(T&& x, Args&&... args) {    
    if constexpr (sizeof...(args)) {
        return fn(x ^ foo(std::forward<Args>(args)...));
    } else {
        return fn(x);
    }
}

这要求您在调用函数时反转参数:

  • foo(x2, x1, x0) => fn(x2 ^ fn(x1 ^ fn(x0)))

Demo

https://stackoverflow.com/questions/74084270/

相关文章:

delphi - TFileStream 比 TMemoryStream 慢

javascript - 警告 IE11 用户他们的浏览器在 React 18 中不受支持

awk - 使用 awk 将字段分隔符 ',' 更改为空格

javascript - 在 Javascript 中没有双 for 循环的情况下用对象数组中的 0

typescript - 如何为 Prisma 选择属性键入变量

regex - 删除换行符后跟多个选项卡正则表达式

c - 使用个性系统调用使堆栈可执行

python - 如何避免 NumPy 中的嵌套 for 循环?

r - 如何在组内创建字母序列?

python - 确定谁拥有超过 80% 的给定发货人