c++ - 折叠表达式与任意可调用?

标签 c++ fold c++17

纵观C++17 paper在折叠(和 cppreference )上,我很困惑为什么选择只与运算符(operator)一起工作?乍一看,它似乎更容易扩展 (... + args)只需推一下 + args 的元素之间的标记,但我不相信这是一个伟大的决定。

为什么二进制 lambda 表达式不能像上面的后者一样工作并遵循相同的扩展?在不支持任意可调用对象的情况下将折叠语法添加到一种语言中,这让我感到不安,那么该语法是否允许一种我没有看到的使用它们的方法?


更新:这适用于可变参数 min()用clang函数

template <typename T>
struct MinWrapper {
    const T& obj;
};

template <typename T, typename U, typename V=std::common_type_t<T,U>>
constexpr MinWrapper<V> operator%(
        const MinWrapper<T>& lhs, const MinWrapper<U>& rhs) {
    return {lhs.obj < rhs.obj ? lhs.obj : rhs.obj};
}


template <typename... Ts>
constexpr auto min(Ts&&... args) {
    return (MinWrapper<Ts>{args} % ...).obj;
}

最佳答案

首先,我很高兴我所写的内容在 clang 中有效(我看到您的更新实现了我提到的 4 个步骤中的 3 个)。我必须感谢 Nick Athanasiou对于在写作 this 之前与我讨论过的这种技术.

我现在提到这个的原因是因为我被告知他发布了 library (在boost库incubator中)实现了这些东西;您可以找到相关文档here 。这似乎是最初的想法(我们都在这里使用)并允许这样的代码:

(Op<Max>(args) + ...); // Op is a function producing the custom fold type

由于惰性求值和有状态运算符而被排除在外(或尚未包括在内,不能确定)。

关于c++ - 折叠表达式与任意可调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582862/

相关文章:

c++ - 尾随返回类型

c++ - 加载RFC5114中定义的1024bit P和G值到boost uint1024

c++ - 如何在 C++ 中实现与 unicode 无关的大小写不敏感比较

Haskell - 严格与非严格与 foldl

scala - 函数式编程,Scala 映射和左折叠

bash - 在 bash 上垂直翻转多个字符串

c++ - 根据模式用数字填充 C++ 数组

python - C++特征库中的argmax()方法

c++ - 另一个命名空间和 CRTP 中的模板友元函数

c++ - eclipse cdt - 更改项目类型