Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
1

Как получить тип возврата шаблонной функции?

11.09.2020, 20:27. Показов 1876. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
template<typename T, typename... Args>
    auto test(T&& obj, Args&&... args){
}
Как получить тип возврата функции obj с аргументами args чтобы создать потом std:ackaged_task?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2020, 20:27
Ответы с готовыми решениями:

Тип контейнера как параметр шаблонной функции
Добрый день. Подскажите, пожалуйста, можно ли передавать тип контейнера как параметр в шаблонную...

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)?
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора --...

Указать тип переменной в шаблонной функции
Доброго времени суток, форумчане! Есть переменная. Есть шаблонная функция. Как в качестве...

Зачем функции дают тип возврата - имя класса?
Думаю вы по названию не поняли, так вот. Допустим я объявил класс Car. Читаю учебник и вижу там...

21
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
11.09.2020, 20:30 2
Цитата Сообщение от ReYalp Посмотреть сообщение
Как получить тип возврата функции obj с аргументами args чтобы создать потом std:ackaged_task?
std::invoke_result
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
11.09.2020, 20:36  [ТС] 3
oleg-m1973,
C++
1
std::invoke_result<std::forward<T>(obj),std::forward<Args>(args)...>::type;
?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
11.09.2020, 20:38 4
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

C++
1
using TRes = std::invoke_result_t<T, Args...>;
Добавлено через 1 минуту
Но, насколько я понял, тебе не совсем это нужно.
Что ты пытаешься сделать с packaged_task?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
11.09.2020, 20:44  [ТС] 5
oleg-m1973, просто создать packaged_task чтобы потом в контейнер вставлять как задачи которые нужно выполнить
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
11.09.2020, 20:55 6
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, просто создать packaged_task чтобы потом в контейнер вставлять как задачи которые нужно выполнить
В контейнер тебе нужно будет конкретную packaged_task класть. Так что invoke_result_t здесь вряд ли понадобится
А так:
C++
1
2
3
4
5
6
7
8
9
10
template<typename TFunc, typename... Args>
auto test(TFunc &&func, Args &&...args)
{
    using TRes = std::invoke_result_t<TFunc, Args...>;
 
    return std::packaged_task<TRes()>([func = std::forward<TFunc>(func), ...args = std::forward<Args>(args)]()
    {
        return std::invoke(func, args...);
    });
}
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
13.09.2020, 16:44 7
Цитата Сообщение от ReYalp Посмотреть сообщение
просто создать packaged_task чтобы потом в контейнер вставлять как задачи которые нужно выполнить
по С.Майерсу - "Эффективный и современный C++"
- через std::shared_future<void>, насколько поняла
(ну детали подкрутить под себя)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
std::promise<void> p ;
std::mutex g_display_mutex;
 
// Функция потока обнаружения
void detect() { // для нескольких задач реакции        
        auto sf=p.get_future().share(); // Тип sf - std :: shared future<void>
        std::vector<std::thread> vt; // Контейнер для потоков реакции
        
        int threadsToRun=5;
 
            for ( int i = 0 ; i < threadsToRun ; ++i ) {
                // Ожидание локальной копии sf ;              
                vt.emplace_back([sf]{
                     sf.wait();
                     react();   //... any reaction function ...
                }); 
            }
        //... do any stuff ...          
        p.set_value() ; // Продолжение всех потоков
        //... do any stuff ...
        //std::this_thread::sleep_for(std::chrono::seconds(2));
        for (auto& t : vt) {    
            // Все потоки делаются неподключаемыми;
            t.join(); 
        }
}
 
//  Функция потока реакции
void react() {
    std::thread::id this_id = std::this_thread::get_id(); 
    g_display_mutex.lock();
    printf("react %d, \n", this_id);
    g_display_mutex.unlock();
};
но в template не знаю как обернуть, да и зачем - вроде в emplace_back() =push_back() любую лямбду можете вставить... никаких оснований для включения в шаблон не вижу... имхо...
просто у меня на -std=c++17 код от oleg-m1973 выдаёт
Windows Batch file
1
warning: pack init-capture only available with '-std=c++2a' or '-std=gnu++2a'
а без 20-го стандарта да и без шаблона норм
P.S.
g_display_mutex добавила, как кажется... - кажется, что в это случае он нужен

Добавлено через 8 минут
и эти не забудьте
C++
1
2
3
4
5
#include <functional>
#include <vector>
#include <thread>
#include <future>
#include <mutex>
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.09.2020, 17:00 8
Цитата Сообщение от JeyCi Посмотреть сообщение
просто у меня на -std=c++17 код от oleg-m1973 выдаёт
Windows Batch fileВыделить код
1
warning: pack init-capture only available with '-std=c++2a' or '-std=gnu++2a'
Ну так выстави, в чём проблема? В майкрософте такое и в 17-й студии работало, правда с другим синтаксисом.

Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
for ( int i = 0 ; i < threadsToRun ; ++i ) {
                // Ожидание локальной копии sf ;             
                vt.emplace_back([sf]{
                     sf.wait();
Попробуй ещё вот так
C++
1
vt.emplace_back([sf = p.get_future()]{
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
13.09.2020, 17:12 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
в чём проблема?
я думала сначала что-то подгружать надо? например в msys2...
т.е. я ведь 20-й не ставила... чтобы использовать его в ide... я же на U++

Добавлено через 6 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
vt.emplace_back([sf = p.get_future
говорит, что
Windows Batch file
1
2
terminate called after throwing an instance of 'std::future_error'
  what():  std::future_error: Future already retrieved
наверно, поэтому нужен shared... имхо
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.09.2020, 17:13 10
Цитата Сообщение от JeyCi Посмотреть сообщение
наверно, поэтому нужен shared... имхо
Убери вот это
Цитата Сообщение от JeyCi Посмотреть сообщение
auto sf=p.get_future().share(); // Тип sf - std :: shared future<void>
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.09.2020, 17:15 11
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Убери вот это
Это ничего не изменит. Взять future можно только один раз и в единственном экземпляре.
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.09.2020, 17:16 12
А ну да, у тебя там несколько потоков непонятно зачем ждут один prоmice. Там да, наверное нужен shared
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.09.2020, 17:17 13
Цитата Сообщение от JeyCi Посмотреть сообщение
просто у меня на -std=c++17 код от oleg-m1973 выдаёт
Вместо захвата пака аргументов в лямбде можно использовать std::bind (это точно должно поддерживаться)
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.09.2020, 17:17 14
Обычно так не делают - это насчёт ожидания promice
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
13.09.2020, 17:57 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Убери вот это
убрала конечно же...
и сам Майерс пишет
тонкостью является то, что каждый поток реакции требует собственную копию std : : shared _ future
тут просто функция-реакции одна...наверно, поэтому... если бы были разные - то, думаю, и ваши поправки прошли бы... спасибо - приму на заметку...
(zayats80888 ответил выше)...
Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Там да, наверное нужен shared
я о том же

Добавлено через 31 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
там несколько потоков непонятно зачем ждут один prоmice.
я вот думаю - может такой вариант удобен для долго-исполняющейся операции?... например загрузка большОго файла?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.09.2020, 18:03 16
Цитата Сообщение от JeyCi Посмотреть сообщение
я вот думаю - может такой вариант удобен для долго-исполняющейся операции... например загрузка большОго файла?
Не, здесь у тебя всё нормально. Я просто этими промайсами пользуюсь крайне редко, поэтому не понял сходу.

Добавлено через 3 минуты
А что значит для "долго-исполняющейся операции", для ожидания её окончания? Ну да, promice вроде именно для этого и были придуманы
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.09.2020, 18:13 17
Цитата Сообщение от JeyCi Посмотреть сообщение
я вот думаю - может такой вариант удобен для долго-исполняющейся операции?... например загрузка большОго файла?
Создание и запуск потока - дорогая операция. В данном случае promise используется как "отмашка", что бы все потоки запустили полезную работу более-менее одновременно. Это иногда используется при отладке, например.
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
13.09.2020, 18:22 18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
для ожидания её окончания?
для исполнени в несколько потоков... хотя да - для IO-bound операций - многопоточность не совсем то, что надо... но нужны async и futures...просто, ну хотя бы, можно ли этот вектор промисов и запускаемый с них вектор тредов - рассматривать как thread-pool?.. отложенный...
? или всё-таки
Цитата Сообщение от zayats80888 Посмотреть сообщение
Создание и запуск потока - дорогая операция.
для этого вектора промисов - все будут запускаться по отдельности? без выигрыша по скорости, как если бы использовался thread-pool?
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,790
13.09.2020, 18:24 19
Цитата Сообщение от JeyCi Посмотреть сообщение
для этого вектора промисов
Для чего для этого?
0
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
13.09.2020, 18:32 20
в смысле "этого_вектора" - vt в примере...
вобщем технически - можно ли его (этот вектор) назвать thread-pool'ом?.. просто отложенным...
или thread-pool выгоднее? ... (по времени создания каждого потока в нём)

Добавлено через 5 минут
хотя, наверно, без разницы по времени создания каждого потока в нём... просто для разных целей - если нужен отложенный...
то use promices - вопрос снимается
0
13.09.2020, 18:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2020, 18:32
Помогаю со студенческими работами здесь

Как получить код возврата функции в консоли js?
Привет! Как получить код возврата функции в отладке в консоли для JS? Спасибо.

Передать тип функции для возврата
Доброго дня. Подскажите пожалуйста, как можно сделать так, что бы в классе была функция, которая...

Тип возврата функции recv и максимально возможный размер принятого пакета.
Как известно,функция recv возвращает переменную типа ssize_t. А может ли вообще сегмент...

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть...

Как использовать в шаблонной функции типы vector или string, и только им присущие функции?
Как использовать в шаблонной функции типы vector или string, и только им присущие функции, чтобы не...

Как получить код возврата?
Здравствуйте! Просьба подсказать, как можно получить код ошибки php скрипта: &lt;?php echo...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru