Re: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 07:15
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>если у нас

B>
B>template<class L> Subscribe(L lambda)
B>{
B>    std::function<сигнатура вызова lambdы> f; // типа void(int, int)
B>    std::function<void(сигнатура параметров lambdы)> f; // типа только "int, int"
B>}

B>Subscribe([](int, int){});
B>

B>возможно както?

Да в принципе, не сложно, если вспомнить, что все лямбды — это просто объекты классов с перегруженными operator(). Можно даже без концептов и SFINAE. И можно даже предоставить универсальную реализацию, которая будет применима не только к лямбдам, но и к обычным функциям, и к определенным пользователем классам функциональных объектов.

Ниже эскизная реализация. До полной реализации здесь не хватает поддержки 'const', 'volatile', '&', '&&', 'nothrow' и всех их комбинаций (это если требуется поддержка пользовательских классов функциональных объектов).

http://coliru.stacked-crooked.com/a/7c29edffdf60891a

#include <string>
#include <tuple>
#include <type_traits>

template <typename>
struct CallableTraits;

template <typename ReturnT, typename...ParamT>
struct CallableTraits<ReturnT(ParamT...)>
{
    static constexpr size_t Arity = sizeof...(ParamT);
    using Signature = ReturnT(ParamT...);
    using ReturnType = ReturnT;
    using ParameterTypes = std::tuple<ParamT...>;
};

template <typename ReturnT, typename...ParamT>
struct CallableTraits<ReturnT(*)(ParamT...)> : CallableTraits<ReturnT(ParamT...)> {};

template <typename T, typename ReturnT, typename...ParamT>
struct CallableTraits<ReturnT(T::*)(ParamT...)> : CallableTraits<ReturnT(ParamT...)> {};

template <typename T, typename ReturnT, typename...ParamT>
struct CallableTraits<ReturnT(T::*)(ParamT...) const> : CallableTraits<ReturnT(ParamT...)> {};

template <typename T>
struct CallableTraits : CallableTraits<decltype(&std::decay_t<T>::operator())> {};

template <typename T>
constexpr size_t CallableArity = CallableTraits<T>::Arity;

template <typename T>
using CallableSignature = typename CallableTraits<T>::Signature;

template <typename T>
using CallableReturnType = typename CallableTraits<T>::ReturnType;

template <typename T, size_t I>
using CallableParameterType = std::tuple_element_t<I, typename CallableTraits<T>::ParameterTypes>;

int main()
{
    int i = 42;

    auto lambda = [=](int, double, const std::string&) { return i; };

    using L = decltype(lambda);

    static_assert(CallableArity<L> == 3, "");
    static_assert(std::is_same_v<CallableSignature<L>, int(int, double, const std::string&)>, "");
    static_assert(std::is_same_v<CallableParameterType<L, 0>, int>, "");
    static_assert(std::is_same_v<CallableParameterType<L, 1>, double>, "");
    static_assert(std::is_same_v<CallableParameterType<L, 2>, const std::string&>, "");
    static_assert(std::is_same_v<CallableReturnType<L>, int>, "");
}
--
Отредактировано 14.08.2020 7:26 rg45 . Предыдущая версия . Еще …
Отредактировано 14.08.2020 7:25 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 7:24 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 7:19 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 7:17 rg45 . Предыдущая версия .
Re[5]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 07:27
Оценка: +1 -1
Здравствуйте, T4r4sB, Вы писали:

TB>Что, добавили новую категорию объектов, из-за чего в класс вектора пришлось добавить ещё 5 видов конструкторов, и ещё 3 случая в метод реаллокации?


Слушай, надоел ты уже своим нытьем. Иди в эвакуаторщики, если для тебя все так сложно.
--
Re[6]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 08:46
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Слушай, надоел ты уже своим нытьем. Иди в эвакуаторщики, если для тебя все так сложно.


Даже-не-джуниор, который пишет в стиле "мамкин хацкер", и не понимает, почему другим это не нравится, будет меня учить?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 09:01
Оценка:
Здравствуйте, T4r4sB, Вы писали:


TB>Даже-не-джуниор, который пишет в стиле "мамкин хацкер", и не понимает, почему другим это не нравится, будет меня учить?


Тебе до моего стиля, расти и расти. Только учить тебя у меня никакого желания нет, ибо бесполезно. Просто нытье твое невежественное достало. В каждой теме одно и то же.
--
Отредактировано 14.08.2020 9:04 rg45 . Предыдущая версия .
Re[8]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 09:03
Оценка:
Здравствуйте, rg45, Вы писали:

R>Тебе до моего стиля, расти и расти.


Стиль "я крутой, потому что умею писать сложно"? Это уровень младших курсов, гуляй.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 09:08
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Стиль "я крутой, потому что умею писать сложно"?


Пресловутая "сложность" выдумана тобой и характеризует только тебя.

TB>Это уровень младших курсов, гуляй.


Когда я был на младших курсах, ты пешком под стол ходил, мой юный друг.
--
Re[10]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 09:17
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Когда я был на младших курсах, ты пешком под стол ходил, мой юный друг.


Тебе что, 45 лет? Ну тогда респект за то, что в таком возрасте ты остался юн душою!
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[11]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 09:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Тебе что, 45 лет?


Это ж пипец, и я еще о чем-то дискутирую с этим человеком

А я что, профиль на РСДН только в этом году завел? Или, может быть, ники каждый год меняю? Гигант мысли ты наш.

TB>Ну тогда респект за то, что в таком возрасте ты остался юн душою!


А, то есть, 45 лет — для тебя это "ТАКОЙ ВОЗРАСТ"? Я, вообще-то думал, что это тебе 45, ошибся походу
--
Отредактировано 14.08.2020 10:09 rg45 . Предыдущая версия . Еще …
Отредактировано 14.08.2020 9:31 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 9:27 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 9:26 rg45 . Предыдущая версия .
Отредактировано 14.08.2020 9:24 rg45 . Предыдущая версия .
Re[2]: Получить сигнатуру из ламбды
От: Went  
Дата: 14.08.20 13:13
Оценка:
Здравствуйте, rg45.
А насколько можно быть увереным, что у лямбды не будет перегруженного оператора скобки? За исключением обобщенных лямбд, возможны отказы в подобной реализации трейтов?
Re[3]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 13:18
Оценка:
Здравствуйте, Went, Вы писали:

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


Признаться, никаких гарантий я найти не смог. Ни по поводу отсутствия дополнительных перегрузок, ни по поводу наличия единственного необходимого оператора. Так что здесь вся надежда на здравый смысл и результаты эксперимента на разных компиляторах. Ну в самом деле, что это может быть, если не operator() и каким образом может оказаться несколько перегрузок?
--
Re[12]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 19:31
Оценка:
Здравствуйте, rg45, Вы писали:

R>А, то есть, 45 лет — для тебя это "ТАКОЙ ВОЗРАСТ"?


Ну, для твоего уровня рассуждений — да, многовато...
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[13]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 19:40
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>А, то есть, 45 лет — для тебя это "ТАКОЙ ВОЗРАСТ"?


TB>Ну, для твоего уровня рассуждений — да, многовато...


Ну ты подрасти немного, сынок, потом поговорим.
--
Re[14]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 19:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну ты подрасти немного, сынок, потом поговорим.


Я вырос из "сложна эта крута", а ты нет.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[15]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 14.08.20 19:49
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Я вырос из "сложна эта крута", а ты нет.


Это нормально. Мне в твоем возрасте тоже казалось, что я вырос.
--
Re[16]: Получить сигнатуру из ламбды
От: T4r4sB Россия  
Дата: 14.08.20 20:32
Оценка: :)
Здравствуйте, rg45, Вы писали:

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


TB>>Я вырос из "сложна эта крута", а ты нет.


R>Это нормально. Мне в твоем возрасте тоже казалось, что я вырос.


Ты даже какашками кидаешься так, будто 2006 это не твоя дата регистрации, а твоя дата рождения.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: Получить сигнатуру из ламбды
От: lpd Черногория  
Дата: 14.08.20 20:40
Оценка: :))) :)))
Здравствуйте, T4r4sB, Вы писали:

TB>Стиль "я крутой, потому что умею писать сложно"? Это уровень младших курсов, гуляй.


Точно, я вообще подозреваю что rg45 — виндузятник. И такие приходят на форум программистов.
Запомните: C++ — это С++03, а именно С с классами. Остальной треш придумали графоманы.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 14.08.2020 20:41 lpd . Предыдущая версия .
Re[11]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 15.08.20 02:04
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


R>>Когда я был на младших курсах, ты пешком под стол ходил, мой юный друг.


TB>Тебе что, 45 лет? Ну тогда респект за то, что в таком возрасте ты остался юн душою!

Дам совет. На фото rg45 одет в обычное ХБ. По всей видимости это повседневка, такую в мою бытность уже носили только для черновых работ, т/е служил он точно раньше 89-го года.

И да — меня тоже раздражает, когда кто-то мыслит так как ты. Если написано сложно, то так писать нельзя. Сложно, иногда — необходимость, и сршенно все равно, может понять это кто-то, или нет. (Вон квантовую механику никто не понимает, главный лозунг — считай и не думай (не помню, кто там кому об этом говорил))
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[10]: Получить сигнатуру из ламбды
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 15.08.20 02:12
Оценка:
Здравствуйте, lpd, Вы писали:

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


TB>>Стиль "я крутой, потому что умею писать сложно"? Это уровень младших курсов, гуляй.


lpd>Точно, я вообще подозреваю что rg45 — виндузятник. И такие приходят на форум программистов.

lpd>Запомните: C++ — это С++03, а именно С с классами. Остальной треш придумали графоманы.
Ого )) сильно заявление. Каким образом стандарт С++ привязан к платформе ? Виндузятник/линуксовик это вообще важно в контексте С++ ..
Думаешь от количества платформ, под которые ты разрабатываешь меняется уровень осознания когда и возможностей ? Вот сейчас имею четыре разные платформы разработки мак / винда / айос / линукс и прочие фрибзди, а задачи и проект все равно — г. А вот под винду, иногда, приходилось уух знатно покодить (архитектурно с компайлтайм рефлекшинами мега хаками) мало кто понимал тот код. Всего двое, но только эти двое и могли писать в этом сегменте, своего рода защита от,... тех кому может не понравиться такой код.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[10]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 15.08.20 05:50
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>Точно, я вообще подозреваю что rg45 — виндузятник.


Оп-па! Козыри пошли
Действительно, что может знать о C++ какой-то виндузятник.
Прямо по Жванецкому

lpd>И такие приходят на форум программистов.


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

lpd>Запомните: C++ — это С++03, а именно С с классами. Остальной треш придумали графоманы.


Ты к кому обращаешься сейчас? Кто должен запомнить, и почему твое невежество того стоит?
--
Отредактировано 15.08.2020 6:14 rg45 . Предыдущая версия . Еще …
Отредактировано 15.08.2020 6:13 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 6:12 rg45 . Предыдущая версия .
Re[17]: Получить сигнатуру из ламбды
От: rg45 СССР  
Дата: 15.08.20 05:52
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ты даже какашками кидаешься так, будто 2006 это не твоя дата регистрации, а твоя дата рождения.


Ты самостоятельно нашел несоответствие между реальностью и своими ощущениями? Поздравляю. Ты на пути к выздоровлению.

У меня только одна маленькая просьба к тебе: постарайся ныть поменьше, ладно?

  Скрытый текст
Ну в самом деле, человек задает конкретный вопрос, можешь помочь — замечательно. Не можешь — ну просто почитай, что пишут другие. Пройди мимо, наконец. А кому интересны вот эти стоны — как все сложно и какие все плохие
--
Отредактировано 15.08.2020 7:19 rg45 . Предыдущая версия . Еще …
Отредактировано 15.08.2020 7:16 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 7:15 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 7:11 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 6:04 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 6:03 rg45 . Предыдущая версия .
Отредактировано 15.08.2020 6:00 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.