Dobrar expressões com chamadas arbitrárias?
Examinando o C ++ 17papel nas dobras (ecppreference), Estou confuso sobre por que a escolha foi feita para funcionar apenas com operadores? À primeira vista, parece que seria mais fácil expandir(... + args)
apenas empurrando um+
token entre os elementos deargs
, mas não estou convencido de que é uma ótima decisão.
Por que uma expressão lambda binária não funciona tão bem e segue a mesma expansão que a anterior acima? É chocante para mim que uma sintaxe dobrada seja adicionada a um idioma sem suporte para chamadas arbitrárias, então a sintaxe permite uma maneira de usá-las que simplesmente não estou vendo?
Atualizar: Isso funciona para uma variávelmin()
função com 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;
}