Open pavelkryukov opened 1 year ago
Т.е. у нас нарушается правило эквивалентности (abc) и abc в этом месте ?
Если это является проблемой (мне казалось, что уже есть примеры, когда скобки меняют поведение), то можно и без скобок разрешить:
auto ptr4 = a.foo; // это создаёт функциональный объект
ptr4(5); // это вызывает функцию
Последний пример -- это кажется в точности std::bind
. Только pointer to member function в стандартной библиотеке следует вперёди указателя на экземпляр класса обычно (или даже всегда).
В C++ валиден такой синтаксис:
При этом выражение
(bar)
может быть присвоено переменной – это указатель на функцию.(a.foo)
– это замыкание, реализованное средствами языка так, что время его жизни крайне короткое, не уверен, что это даже считается выражением. В работе [1] вводится термин PMFC (pending member function call). Чтобы продлить время жизни этой конструкции, её нужно завернуть в лямбда-функцию.Чем больше обобщений требуется, тем больше шаблонов и
&&
-ов будет содержать лямбда. Многословность можно решить через препроцессор со всеми вытекающими проблемами:Помимо общих проблем макросов, нужно учесть и специфику лямбд...
Почему бы тогда не задействовать неявный синтаксис, уже наполовину предоставляемый языком, и возложить создание подходящего функционального объекта на компилятор? Сравните с примером
ptr1
выше.Для этого в библиотеке нужен такой класс, либо лямбда:
и способ научить компилятор перетащить аргументы операторов
.
,->
,.*
,->*
в его/её конструктор:Возможный вариант — парсить выражение в скобках как
std::pair
, и уже в таком виде подавать вstd::call
(либо отнаследовать его отstd::pair
).Ссылки: