Вам необходимо преобразовать int
в std::string
:
tp[i] = ThreadGuard(std::thread(doWork, std::to_string(i)));
Вам также не нужно писать собственный конструктор перемещения и оператор присваивания перемещения. Используйте default
:
class ThreadGuard {
public:
explicit ThreadGuard(std::thread&& input): t(std::move(input))
{}
ThreadGuard(ThreadGuard const& t) = delete;
ThreadGuard(ThreadGuard&&) noexcept = default;
ThreadGuard& operator=(ThreadGuard const&) = delete;
ThreadGuard& operator=(ThreadGuard&&) noexcept = default;
~ThreadGuard(){
if(t.joinable()){
t.join();
}
}
private:
std::thread t;
};
. Вы также можете заставить конструктор преобразования принимать аргументы конструктора потока и пересылать их напрямую:
template<typename...Args>
explicit ThreadGuard(Args&&... args): t(std::forward<Args>(args)...)
{}
, что позволило бы создать его следующим образом :
tp[i] = ThreadGuard(doWork, std::to_string(i));
Также стоит отметить: в C ++ было добавлено 20 std::jthread
, которое join()
автоматически при уничтожении.