我想在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);
};
};
是否可以通过单个模板头接受带有可变参数的函数?
谢谢大家
答案 0 :(得分:3)
具有专长:
template <auto value>
class worker;
template <typename ... TParams, void (*F)(TParams...)>
class worker<F>
{
public:
void push(TParams... args);
};