Konstantin
ну если ты контролируешь ВЫЗЫВАЮЩУЮ программу, то в чем проблема то
Я контролирую обвязку вокруг фортрана, но не вызывающую программу
Berkus
Я контролирую обвязку вокруг фортрана, но не вызывающую программу
ну плохо, тогда тебе придется врапить pthread_create или что там используется
Yury
Господа, у класса есть метод: template <typename... T> void test(std::function<void(T...)> callback) { } При попытке вызова foo->test<std::string>([](std::string n) -> void {}); Получаю ошибку Error: no matching member function for call to 'test' Как правильно описать сигнатуру метода?
Дмитрий ⬡
Может void(*)(T..)?
Yury
Не, такая же ошибка.
Yury
Есть вообще возможность передать колбек с неизвестным списком параметров?
B
C++14 da
Yury
А в 11?
Vladislav
https://ideone.com/LeDva3
Yury
Спасибо 👍
Yury
Как называется такой синтаксис?
Vladislav
uniform initialization :)
Yury
👍
Yury
> а затем вытащить всё, что требуется? Можно подробнее? Не шарю.
Matwey
Это неплохой вариант
Но непереносимый
Vladislav
если типы аргументов не нужны внутри test
Александр
> а затем вытащить всё, что требуется? Можно подробнее? Не шарю.
ну вот зачем тебе типы всех аргументов коллбэка?
Александр
а если нужны, есть ведь дофига мета-магии
Yury
Потом по айди и сигнатуре (с помощью dynamic_cast) вытащить и вызвать колбек.
Александр
вызов вообще элементарный будет - foo->test([](std::string n) {});
Yury
Некий аналог кода: https://gist.github.com/rioki/1290004d7505380f2b1d
Александр
нужно реализовать type erasuse? не понимаю задачу, сформулируй конкретнее
Александр
функции с разными типами аргументов складывать в один контейнер как минимум глупо. можно попробовать использовать any для этих целей, если планируется контроль за типами какой-то внешний
Alexander
Помогите пожалуйста
Alexander
Добрый вечер
Alexander
Есть два массива
Alexander
Необходимо сортировать первый, при этом менять таким же образом элементы второго. Пример: 5 4 3 2 1 6 7 8 9 10 После: 1 2 3 4 5 10 9 8 7 6
Alexander
Нужен qsort
Yury
нужно реализовать type erasuse? не понимаю задачу, сформулируй конкретнее
Вызывать колбеки по айди (тип события) и списку параметров.
Александр
Некий аналог кода: https://gist.github.com/rioki/1290004d7505380f2b1d
если хочется сделать как в этой функции: unsigned int EventEmitter::on(unsigned int event_id, std::function<void ()> cb) { return add_listener(event_id, cb); } но для произвольного типа коллбэка, то подумай для начала о том, кто будет контролировать, что где-то в коде ты передашь нужное количество аргументов нужного типа
Yury
dynamic_cast?
Александр
кого к кому?
Александр
в C++ нет типа dynamic/object/wtf
Александр
есть вариант, конечно..
Yury
Listener<Args...>* listener = dynamic_cast<Listener<Args...>*>(rawListener);
Yury
у листенера уже хранится колбек в свойстве
Александр
а, т.е. вызывающая сторона в курсе, кого вызывать?
Yury
ага
Александр
тогда просто достаточно реализуется
Yury
например eventEmitter->emit( "tap", 33, 128 );
Александр
сейчас набросаю код
Yury
Спасибо 👍
Александр
Спасибо 👍
можно это улучшить, позволив убрать явное указание типов и лишние {}, но это: а) много кода, б) возможность выстрелить себе в ногу, вызвав не с теми типами. подобная вещь очень похожа на runtime-рефлексию, которая языком нативно не поддерживается (и хорошо), поэтому обычно делают свои собственные костыли с type erasure, std::any/std::variant с конечным набором параметров https://wandbox.org/permlink/MN6GGf1pFtHDCswC
Yury
Спасибо, буду разбираться 👍
Egor
Гм, а нельзя ли map также индексировать typeid(std::function<Args...>) или чем-то таким? Правда, тогда исчезнет возможность конвертации типов аргументов.
Vladislav
если не кастовать явно к неправильному указателю на функцию
Александр
а как можно что-то вызвать не с теми типами?
если завернуть функцию в std::any, то легко
Egor
а как можно что-то вызвать не с теми типами?
Ровно так и можно, да: emit<int, string>("on_click", 100, "200");
Egor
Тогда any_cast сфейлится
Vladislav
ну это не будет вызовом не с теми параметрами, по идее
Egor
Даже хуже. The program is ill-formed.
Egor
А, не, просто исключение.
Yury
А как колбеки в памяти хранятся? Нужно ли их как-то чистить потом? Особенно, если через captures что-то в колбек передал?
Александр
о, сделал реализацию без any: https://wandbox.org/permlink/Ouyjy5t1OIs7496z
Egor
А как колбеки в памяти хранятся? Нужно ли их как-то чистить потом? Особенно, если через captures что-то в колбек передал?
Если в коде выше с any - то там на каждый any создаётся в куче элемент, который владеет коллбэком по значению. Чистить никак не надо. Удалили any - удалили коллбэк
Yury
👍
ttldtor
вот бы ещё MFC убрать из топика данного чата
Andrey
зачем?
ttldtor
https://docs.microsoft.com/ru-ru/cpp/mfc/reference/cwinformsview-class
ttldtor
нет документации для не CLI. Архитектор этого поделия, насколько мне известно, является архитектором дотнета по совместительству. С большой натяжкой MFC можно как-то назвать ... гм ... OOP-библиотекой. Да и просто это адовое легаси.
ttldtor
Ну и да, венгерская нотация... убивал бы
Berkus
а как же CWin для Class Win? чем не венгерская нотация
ttldtor
ну вот банальный метод с параметрами, в названии которых присутствует венгерская натация...гм https://docs.microsoft.com/en-us/cpp/mfc/reference/clistctrl-class#createex
ttldtor
я всегда считал, что это просто надстройка над винапи, но с классами
Ioann_
А я вот, придерживаюсь венгерской нотации, но не во всем. Ну типа CWin, это да - по моей части, нотип переменной в ее имени - мимо
Ioann_
А разве CWin == class win, это и не есть что-то от Венгерской нотации ?
Ioann_
Еще вот это активно использую: m_ префикс для переменной класса
Berkus
ну ты прямо авторов MFC описал
Ioann_
Ну, возможно я идиот - не спорю. И тем не менее, некоторые(подчеркиваю), правила и идиомы Венгерской нотации нахожу более чем логичными и удобными
ttldtor
вот даже кодстайл есть https://msdn.microsoft.com/en-us/library/windows/desktop/aa378932(v=vs.85).aspx
ttldtor
ну я же дал ссылку на артефакты венгерской нотации и C* - следование венгерской нотации в MFC, гм