шаблонный класс c ++ с указателем на функцию с переменным числом - PullRequest
0 голосов
/ 21 октября 2019

Я хочу реализовать класс спулера / работника в c ++, который имеет функцию для добавления новых задач в класс, чтобы они выполнялись фоновым потоком. Задача добавляется в очередь, и если рабочий не выполняется, она запускается.

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

template <void (*TFunction)(typename ... TParams)> //a parameter pack is not allowed here
class worker
{
public:
    push(TParams... args);
};
template <typename ... TParams, void (*TFunction)(TParams...)> //template parameter pack not at end of parameter list
class worker
{
public:
    push(TParams... args);
};

У меня есть две идеи, которые будут работать, но мне тоже не нравится.

template <typename ... TParams>
class worker
{
public:
    worker(void(*function)(TParams...)): function_(function) { }
    push(TParams... args);

private:
    const void (*function_)(TParams...);
};

template <typename ... TParams>
struct variadic
{
    template <void*(TFunction)(TParams...)>
    class worker {
    public:
        push(TParams... args);
    };
};

Есть ли способ принять функцию с переменными параметрамис одним заголовком шаблона?

Спасибо всем

1 Ответ

3 голосов
/ 21 октября 2019

со специализацией:

template <auto value>
class worker;

template <typename ... TParams, void (*F)(TParams...)>
class worker<F>
{
public:
    void push(TParams... args);
};

Демо

...