纵观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/