Re[4]: Получить сигнатуру из ламбды
От: _NN_ www.nemerleweb.com
Дата: 15.08.20 09:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Went, Вы писали:


W>>А насколько можно быть увереным, что у лямбды не будет перегруженного оператора скобки? За исключением обобщенных лямбд, возможны отказы в подобной реализации трейтов?


R>Признаться, никаких гарантий я найти не смог. Ни по поводу отсутствия дополнительных перегрузок, ни по поводу наличия единственного необходимого оператора. Так что здесь вся надежда на здравый смысл и результаты эксперимента на разных компиляторах. Ну в самом деле, что это может быть, если не operator() и каким образом может оказаться несколько перегрузок?


7.5.5 lambda-expressionis a prvalue whose result object is called theclosure object. [Note: A closure objectbehaves like a function object 

7.5.5.1  Closure types[expr.prim.lambda.closure]1
The type of alambda-expression(which is also the type of the closure object) is a unique, unnamed non-unionclass type, called theclosure type, whose properties are described below.


Есть гарантия, что это класс с операцией вызова "operator()".
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 15.08.20 10:09
Оценка:
Здравствуйте, ollv, Вы писали:


O>И да — меня тоже раздражает, когда кто-то мыслит так как ты. Если написано сложно, то так писать нельзя. Сложно, иногда — необходимость, и сршенно все равно, может понять это кто-то, или нет.


Иногда сложность вызвана кулхацкерскими амбициями, иногда — идиотским дизайном языка. В этих случаях необходимости нет.
Re[5]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 15.08.20 11:07
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>
_NN>7.5.5 lambda-expressionis a prvalue whose result object is called theclosure object. [Note: A closure objectbehaves like a function object 

_NN>7.5.5.1  Closure types[expr.prim.lambda.closure]1
_NN>The type of alambda-expression(which is also the type of the closure object) is a unique, unnamed non-unionclass type, called theclosure type, whose properties are described below.
_NN>


_NN>Есть гарантия, что это класс с операцией вызова "operator()".


Ну вот если бы где-нибудь упоминался явно "operator()", это развеяло бы все мои сомнения, но этого же нет. 'like a function object', как я это понимаю, означает, что доступно выражение вида: f(). А вот доступно ли выражение вида f.operator()() ? В это хочется верить, конечно, и эксперименты это подтверждают, но... остается некоторая неудовлетворенность.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: Получить сигнатуру из ламбды
От: _NN_ www.nemerleweb.com
Дата: 15.08.20 13:14
Оценка: 6 (1) :)
Здравствуйте, rg45, Вы писали:

R>Ну вот если бы где-нибудь упоминался явно "operator()", это развеяло бы все мои сомнения, но этого же нет. 'like a function object', как я это понимаю, означает, что доступно выражение вида: f(). А вот доступно ли выражение вида f.operator()() ? В это хочется верить, конечно, и эксперименты это подтверждают, но... остается некоторая неудовлетворенность.


В 7.5.5.1 12

The lambda-expression’scompound-statement yields thefunction-body(9.5) of the function call operator,


https://eel.is/c++draft/expr.prim.lambda.closure#12

Оно?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 15.08.20 14:31
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>В 7.5.5.1 12

_NN>

_NN>The lambda-expression’scompound-statement yields thefunction-body(9.5) of the function call operator,


_NN>Оно?


Да хз, может и оно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[13]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 16.08.20 01:09
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, ollv, Вы писали:



O>>И да — меня тоже раздражает, когда кто-то мыслит так как ты. Если написано сложно, то так писать нельзя. Сложно, иногда — необходимость, и сршенно все равно, может понять это кто-то, или нет.


TB>Иногда сложность вызвана кулхацкерскими амбициями, иногда — идиотским дизайном языка.

Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так.
Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ? НЕ нравится С++ в целом — никто не заставляет. НЕ нравятся шаблоны — предложи как лучше распарсить сигнатуру в компайлтайм. Вот это против всего плохого за все хорошее — не тот топик.

TB>В этих случаях необходимости нет.

Как это нет ? Нет необходимости парсить сигнатуру? Молодец
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[14]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 16.08.20 09:09
Оценка: :))
Здравствуйте, ollv, Вы писали:

O> Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так.

O>Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ?

Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.
Re[15]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 16.08.20 13:01
Оценка: +1 -1
Здравствуйте, T4r4sB, Вы писали:

TB>Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.


--
Не можешь достичь желаемого — пожелай достигнутого.
Re[15]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 17.08.20 12:11
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, ollv, Вы писали:


O>> Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так.

O>>Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ?

TB>Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.

В каком виде ?
Даже нет
Вот давай
template <typename... Args>
inline some_return_type fun(Args... args);
typedef GET_TYPE_BASED_SIGN_MACRO(fun(5, std::string(), float(), char()) sign_type;

ну и давай получим к примеру тип 3-го аргумента
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 17.08.2020 12:23 Маркуша Шулин . Предыдущая версия .
Re[16]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 17.08.20 18:45
Оценка:
Здравствуйте, ollv, Вы писали:

O> В каком виде ?


Ключевое слово, параметр — указатель на функцию или функциональный тип, или тип с оператором (), возвращающее тип.
Я не знаю, что такое GET_TYPE_BASED_SIGN_MACRO
Re[17]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.08.20 07:15
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, ollv, Вы писали:


O>> В каком виде ?


TB>Ключевое слово, параметр — указатель на функцию или функциональный тип, или тип с оператором (), возвращающее тип.

Погоди — давай код, как бы ты хотел, чтобы оно выглядело. Задача есть — берешь сигнатуру и получаешь тип третьего параметра. как это делается на плюсах мы примерно все знаем.
Там много парсить и много кейсов, но принцип понятен . Давай покажи нам свое предложение. Что значит ключевое слово ?

так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?


TB>Я не знаю, что такое GET_TYPE_BASED_SIGN_MACRO

переименуй как хочешь я же тебе именно это предлагаю.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[2]: Получить сигнатуру из ламбды
От: Went  
Дата: 18.08.20 09:06
Оценка:
Здравствуйте, rg45.
Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
Что-то такое:
void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.

// Эта функция должна взять произвольный функтор без возвратного значения, но с любым набором аргументов, и создать функтор с аргументами, который будет класть этот функтор в очередь, прибиндив аргументы
template<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
  std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
  {
    add_message_in_queue(???); // И тут
  };

  return result;
}

void main()
{
  auto x = [](int, float){};
  auto y = defer(x);

  y(1, 1.0f); // Должен не вызвать реализацию x, а положить его в очередь, прибиндив единицы как аргументы вызова к x.
}
Re[3]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 18.08.20 09:15
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>Здравствуйте, rg45.

W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
  Скрытый текст
W>Что-то такое:
W>
W>void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.

W>// Эта функция должна взять произвольный функтор без возвратного значения, но с любым набором аргументов, и создать функтор с аргументами, который будет класть этот функтор в очередь, прибиндив аргументы
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W>  std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W>  {
W>    add_message_in_queue(???); // И тут
W>  };
W>  return result;
W>

W>void main()
W>{
W>  auto x = [](int, float){};
W>  auto y = defer(x);

W>  y(1, 1.0f); // Должен не вызвать реализацию x, а положить его в очередь, прибиндив единицы как аргументы вызова к x.
W>}

W>



так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ? если да, то
    typedef typename convert_2args_type<typename stdext::call_traits<T>::signature>::type args_tuple_type;
    std::function<typename stdext::call_traits<T>::signature> result = [fnc](args_tuple_type const& args)
     {
            // Здесь форейч по всем аргументам и в конце итерации вызов непосредственно функции 
        call_func_add_message_in_queue<0>(args);
        
     };

если же у тебя внешний интерфейс и локальная типизация извне не видна можно пихать в некий абстрактнфй тип вроде boost::any кастить перед вызовом.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Отредактировано 18.08.2020 9:22 Маркуша Шулин . Предыдущая версия . Еще …
Отредактировано 18.08.2020 9:19 Маркуша Шулин . Предыдущая версия .
Отредактировано 18.08.2020 9:18 Маркуша Шулин . Предыдущая версия .
Re[3]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 18.08.20 09:25
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, rg45.

W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W>  std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W>  {
W>    add_message_in_queue(???); // И тут
W>  };

W>  return result;
W>}
W>


Ну, если я правильно понял идею, то так:

template<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
  std::function<typename stdext::call_traits<T>::signature> result = [fnc](auto&&...args)  // Вот что записать тут?
  {
    add_message_in_queue(fnc(std::forward<decltype(args)>(args)...)); // И тут
  };

  return result;
}


Хотя, из твоего описания, вроде бы, следует, что тут нужна еще одна обертка из std::function. Даже если и так, то там будет все по образу и подобию, как я показал.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 18.08.2020 9:33 rg45 . Предыдущая версия . Еще …
Отредактировано 18.08.2020 9:30 rg45 . Предыдущая версия .
Re[18]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 18.08.20 09:37
Оценка:
Здравствуйте, ollv, Вы писали:

O> так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?\


Ну например, только троечка должна быть параметром, а не частью имени, конечно же.
Re[3]: Получить сигнатуру из ламбды
От: night beast СССР  
Дата: 18.08.20 09:37
Оценка: 5 (2)
Здравствуйте, Went, Вы писали:

W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов

W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.

в рамках 11 проблемно.
шаблонные лямбды (вариант rg45) в 14 появились
как вариант возвращать ручную реализацию
template<typename Sig>
struct FunctionProxy
{
   typedef std::function<void()> fn_type;

   template<typename... Args>
   fn_type operator()(Args&&... args)
   {
      std::tuple<???> t(args); // тип из сигнатуры вытащить
      return [fn, t]() { std::apply(fn, t); };
   }

   std::function<Sig> fn;
}.
Re[4]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 18.08.20 09:39
Оценка:
Здравствуйте, night beast, Вы писали:

NB>в рамках 11 проблемно.

NB>шаблонные лямбды (вариант rg45) в 14 появились

Ах, точно! Забывать начинаю хронологию. Так а что ж там за компилятор тогда? 2013-я студия что ли?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: Получить сигнатуру из ламбды
От: Went  
Дата: 18.08.20 09:49
Оценка:
Здравствуйте, rg45, Вы писали:
R>Ах, точно! Забывать начинаю хронологию. Так а что ж там за компилятор тогда? 2013-я студия что ли?
Она, родимая
Re[6]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 18.08.20 09:50
Оценка:
Здравствуйте, Went, Вы писали:

R>>Ах, точно! Забывать начинаю хронологию. Так а что ж там за компилятор тогда? 2013-я студия что ли?

W>Она, родимая

А что препятствует переходу на что-то более свеженькое?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Получить сигнатуру из ламбды
От: night beast СССР  
Дата: 18.08.20 10:01
Оценка: +1
Здравствуйте, rg45, Вы писали:

W>>Она, родимая


R>А что препятствует переходу на что-то более свеженькое?


предполагаю, что игроделы неохотно обновляются.
некоторые либы идут в бинарниках, для конкретной студии...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.