запретили использовать структурный биндинг в параметрах? Ведь это
someFunction([&](auto [first, second]){
...
});
намного удобнее чем писать так
someFunction([&](auto param){
auto [first, second] = param;
...
});
А пока чтобы решить это неудобство приходится юзать макрос
#define I ,
#define _(autoSpec, bindings, body) (autoSpec _____){ autoSpec [bindings] = _____; body }
someFunction([&]_(auto, first I second, {
....
}));
Или если такого запрета в стандарте нет то может можно поправить компилятор? Или если есть ограничения со стороны формальной грамматики то может есть смысл написать пропозал - по идее его должны будут быстро принять так как это попадает под одну из приоритетных целей плюсов - свести на нет необходимость использования макросов (а сейчас это неудобство решить другим способо кроме макросов нельзя)
Специально в стандарте удобные фичи никто не запрещает
>> Или если такого запрета в стандарте нет то может можно поправить компилятор? Я предлагаю в следующий раз отправиться смотреть эту статью и багтрекер компиляторов на предмет поиска степени соответствия реализации фичи стандарту >> по идее его должны будут быстро принять так как это попадает под одну из приоритетных целей плюсов - свести на нет необходимость использования макросов На самом деле, я сомневаюсь, что кто-то кроме вас так делает, поэтому вряд ли кто-то заметить пользу от этого новшества А вообще, я бы порекомендовал семантически различные параметры передавать действительно отдельными параметрами вместо того, чтобы отправлять какую-то неведомую нетипизированную кашу, а потом её биндить внутри
Кстати а можно ли заменить этот макрос неким шаблонным метопрограммированием - написать некую функцию-враппер "proxy" которая пробросит структурный биндинг в соотвествующее количество аргументов? handler(proxy([&](auto first, auto second){ //handler([&](auto [first, second]){ ... }));
Да, не только можно, но она уже и есть – std::apply
спасибо, только самого std::apply недостаточно и нужен еще небольшой враппер #include <tuple> #include <iostream> auto bind = [](auto&& fn){ return [&](auto&& arg){ std::apply( std::forward<decltype(fn)>(fn), std::forward<decltype(arg)>(arg) ); }; }; auto handler = bind([](auto first, auto second, auto third){ std::cout << first << second << third; }); int main() { auto tuple = std::tuple(1,2,3); handler(tuple); } В стандартной библиотеке нет еще такого хелпера? Может есть смысл написать пропозал чтобы добавили?
Если я ничего не упустил, то std::bind_front( LIFT(std::apply), [](auto...){}) (std::tuple(1,2,3))
Полагаю, дело в том, что параметры функции описывают её реальные, "физические" аргументы (передаваемые через стек или регистры), а биндинги к таковым отношения не имеют
> (а сейчас это неудобство решить другим способо кроме макросов нельзя) не считая конечно написания строчки кода
Я бы начал с ответа на вопрос "а что такое f, если она определена как void f(auto [a, b])?" - функция? шаблон функции?
Шаблон функции это что?
template <class T> T max(T a,T b) например
Обсуждают сегодня