【发布时间】:2015-02-19 09:10:04
【问题描述】:
查看折叠上的 C++17 paper(以及 cppreference),我很困惑为什么选择只与运算符一起使用?乍一看,通过在args 的元素之间插入一个+ 标记似乎可以更轻松地扩展(... + args),但我不相信这是一个很好的决定。
为什么二进制 lambda 表达式不能像上面的后者一样工作并遵循相同的扩展?在不支持任意可调用对象的情况下将折叠语法添加到语言中,这让我感到震惊,那么该语法是否允许以一种我看不到的方式使用它们?
更新:这适用于带有 clang 的可变参数 min() 函数
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;
}
【问题讨论】:
-
折叠表达式的主要原因是用于概念。 “普通”用户代码已经可以用普通库算法实现各种折叠。
-
@KerrekSB 仍然可以有一个使用概念的可调用对象,并且除了应用运算符之外还可以做一些事情
-
好点。写一篇论文。
-
呸。现在我需要想办法让它与命名运算符一起工作。唔。可能是不可能的。嗯。
-
我认为只有运营商才能保持提案的规模较小。另请查看支持空包的有限操作列表 - 我想如果您允许任意 bin-fns,则必须扩展整个内容以干净地处理它。也就是说,与您的 Q 一致,我发现该提案相当简洁,更不用说半成品。