и нет типа с именем 'type' в 'классе std :: result_of - PullRequest
0 голосов
/ 27 мая 2018

я пытаюсь построить простую инкапсуляцию для вектора из std :: thread;Я хочу инициализировать до МАКСИМАЛЬНОГО количества потоков.Если я достигну максимального количества, основной поток запустит код (запись в выходные файлы).Я сохраняю вектор класса, содержащего std :: thread и флаг bool.вместо того, чтобы запускать функцию напрямую через конструктор std :: threads, я отправляю функцию-обертку, которая изменит логический флаг, так что я смог бы проверить поток, если он закончил, и если нет, продолжать работу (иесли он закончился, присоединитесь и закройте его).Мой код для оболочки:

#include <thread>

class RvThread {
    bool is_running;
    std:thread this_thread;

    template <typename F, typename ... Args>
    static void function_wrapper(bool* flag, F &&function, Args&& ... args) {
        function(args...);
        *is_running = false;
    }
public:
    template <typename F, typename ... Args>
    RvThread(F &&function, Args&& ... args) : is_running(true), this_thread(RvThread::function_wrapper<F, Args...>,&is_running,function, args...) {}
    ~RvThread(){
        join();
    }
    void join () {
        this_thread.join();
    }
    bool is_done() {
        return !is_running;
    }
};

template <unsigned char max_threads>
class Threads {
    unsigned char num_active;
    std::vector<RvThread> running_threads;
    void join_done(){
        for (auto &it : running_threads) {
            if (it->is_done()) {
                running_threads.remove(it);
                num_active--;
            }
        }
    }
public:
    Threads() : num_active(0) {}
    template <typename F, typename ... Args>
    void run(F&& function, Args&& ... args) {
        join_done();
        if (num_active < max_threads) {
            running_threads.push_back(RvThread(function, args...));
            num_active++;
        } else {
            function(args...);
        }
    }
};

и функция, которую я пытаюсь передать:введите 'in' класс std :: result_of

...