Попытка поставить в очередь какую-то разнообразную работу - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь написать рабочую очередь, однако я действительно не хочу знать типы аргументов до тех пор, пока я не попытаюсь написать что-то с эффектом


std::queue<std::packaged_task<void()>> workQueue{};

template <typename... Args>
void Foo::doWork(char const* key, Args&&... args)
{
    // this already works if called directly but would like to do this work from a separate thread pulling from that queue
}

template <typename... Args>
void Foo::enqueue(char const* key, Args&&... args)
{
    // Cannot seem to push this work into a queue type error occurs
    workQueue.emplace(std::bind(&Foo::doWork<Args&&...>, this, key, args...));
}

пример использования

foo.enqueue("bar", 3, 4, "wham", true);

Я стараюсь ставить в очередь эту работу настолько быстро, насколько это разумно, чтобы сохранить как можно больше работы на стороне сбора. Я просто сериализовал бы аргументы во что-то вроде струнного потока, но тогда мне пришлось бы выполнить своего рода приведение к типу действия на стороне десериализации, беспокоиться о границах сообщение + и т. Д., И я хотел бы избежать этого. У кого-нибудь есть идеи, что я могу сделать не так, чтобы получить ошибки типа, а также попытаться избежать форсирования, чтобы контейнеры stl были лучшими. Я не могу знать структуру заранее, чтобы просто специализироваться на этом. Также вы хотите убедиться, что аргументы копируются в очередь, а не просто ссылаются, чтобы они были полезны даже после удаления из стека из вызывающей функции.

...