Сообщение Re[3]: Получить сигнатуру из ламбды от 18.08.2020 9:25
Изменено 18.08.2020 9:33 rg45
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45.
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
Ну, если я правильно понял идею, то так:
Хотя, из твоего описания, вроде бы, следует, что тут нужна еще одна обертка из std::function. Но там все по образу и подобию, как я показал.
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. Но там все по образу и подобию, как я показал.
Re[3]: Получить сигнатуру из ламбды
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45.
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
W>Что-то такое:
W>
Ну, если я правильно понял идею, то так:
Хотя, из твоего описания, вроде бы, следует, что тут нужна еще одна обертка из std::function. Даже если и так, то там будет все по образу и подобию, как я показал.
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. Даже если и так, то там будет все по образу и подобию, как я показал.