Сообщение Re[3]: Получить сигнатуру из ламбды от 18.08.2020 9:15
Изменено 18.08.2020 9:18 Маркуша Шулин
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45.
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ?
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);
};
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45.
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ?
W>Здравствуйте, rg45.
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
W>void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.
[cut]
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> };
[/cut]
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);
};