Я пытаюсь написать рабочую очередь, однако я действительно не хочу знать типы аргументов до тех пор, пока я не попытаюсь написать что-то с эффектом
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 были лучшими. Я не могу знать структуру заранее, чтобы просто специализироваться на этом.
Также вы хотите убедиться, что аргументы копируются в очередь, а не просто ссылаются, чтобы они были полезны даже после удаления из стека из вызывающей функции.