Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 24.10.2017
Сообщений: 43

Передача шаблонных в функций в конструктор std::thread

03.03.2019, 19:26. Показов 4374. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Есть небольшой пример, отражающий суть моей проблемы - необходимо перебросить в поток шаблонизированную функцию.
Уже перешерстил довольно много страниц яндекса, так и не понял, в чём тут дело. Прошу помощи.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <thread>
using namespace std;
template <class T> void my_function(T var){
    cout << var;
}
int main(){
    thread my_thread(my_function, 10);
    my_thread.join();
    return 0;
}
Вывод компилятора адского размера:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[1.cpp 2019-03-03 16:24:11.239]
In file included from 1.cpp:2:
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:118:7: note: candidate: 'template<class _Callable, class ... _Args> std::thread::thread(_Callable&&, _Args&& ...)'
       thread(_Callable&& __f, _Args&&... __args)
       ^~~~~~
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:118:7: note:   template argument deduction/substitution failed:
1.cpp:8:37: note:   couldn't deduce template parameter '_Callable'
     thread my_thread(my_function, 10);
                                     ^
In file included from 1.cpp:2:
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:113:5: note: candidate: 'std::thread::thread(std::thread&&)'
     thread(thread&& __t) noexcept
     ^~~~~~
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:113:5: note:   candidate expects 1 argument, 2 provided
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:106:5: note: candidate: 'std::thread::thread()'
     thread() noexcept = default;
     ^~~~~~
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/thread:106:5: note:   candidate expects 0 arguments, 2 provided
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2019, 19:26
Ответы с готовыми решениями:

Конструктор std::thread
Доброго времени суток, помогите, пожалуйста, понять, в чем ошибка? #include &lt;functional&gt; #include &lt;algorithm&gt; #include...

Передача std::vector в конструктор[по ссылке\указателю ?]
Доброго времени суток. Есть такой интерфейс класса: class HH_model_class { private: std::vector&lt;double&gt; parameters; ...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void test(vector&lt;char&gt; data) { ...

6
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
03.03.2019, 19:35
Лучший ответ Сообщение было отмечено RomanQed как решение

Решение

RomanQed,
C++14
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <thread>
using namespace std;
template <class T> void my_function(T var){
    cout << var;
}
int main(){
    thread my_thread([](auto x) { my_function(x); }, 10);
    my_thread.join();
    return 0;
}
2
0 / 0 / 0
Регистрация: 24.10.2017
Сообщений: 43
03.03.2019, 19:38  [ТС]
DrOffset, благодарю.
p.s. Боже, что это за жесть с лямбдами...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2019, 19:41
вот такой вызов помогает:
C++
1
thread my_thread(my_function<int>, 10);
1
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
03.03.2019, 19:45
Цитата Сообщение от RomanQed Посмотреть сообщение
с лямбдами
Можно и без них.

C++
1
2
3
4
5
6
7
8
9
10
11
struct my_function {
    template <class T> void operator()(T var){
        cout << var;
    }
};
 
int main(){
    thread my_thread(my_function{}, 10);
    my_thread.join();
    return 0;
}
Добавлено через 1 минуту
RomanQed, да, посмотрите на #4, может вам действительно не нужно передавать шаблонную функцию, а просто конкретную специализацию? Тогда в #4 именно то, что нужно. Но тогда вы несколько некорректно сформулировали вопрос темы.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2019, 19:55
DrOffset, как я понимаю, при вызове шаблона нельзя отложить вопрос о типе - параметре на время выполнения, поэтому передать шаблон попросту нельзя. Сгенерировать указатель на функцию для конструктора потока нельзя не указав явного инстацирования (встраиваемый код, скажем, не устроит конструктор, так как адреса у него нет). Я не уверен, но больше идей пока нет.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
03.03.2019, 19:59
Цитата Сообщение от IGPIGP Посмотреть сообщение
как я понимаю, при вызове шаблона нельзя отложить вопрос о типе - параметре на время выполнения, поэтому передать шаблон попросту нельзя.
Да, все верно.
Собственно приведенные мной способы не передают шаблон, они передают объект с шаблонным оператором (), что позволяет достичь требуемого эффекта шаблонности вызова.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2019, 19:59
Помогаю со студенческими работами здесь

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

Boost::thread vs std::thread
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно...

Использование шаблонных функций
Всем привет) Очень нужна помощь. нужно написать прогу для поиска максимального и минимального значения линейного массива, подогнать её...

Использование шаблонных функций
Разработайте программу с шаблонными функциями для типов int, float и double. Данные в функции передаются в качестве параметров....

Перегрузка шаблонных функций
Есть шаблонный класс А, шаблонный параметр которого - это тип его поля. Есть шаблонные классы В и С, шаблонные параметры которых - тип...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru