【发布时间】:2017-01-30 10:05:36
【问题描述】:
我有一个工作虚函数add,它使用以下设置:
using Func = std::function<std::vector<unsigned char>()>;
class cfExecutor {
public:
cfExecutor();
virtual ~cfExecutor();
/// Enqueue a function to be executed by this executor. This and all
/// variants must be threadsafe.
virtual void add(Func) = 0;
virtual void add(std::vector<Variant> params, Func callback) = 0;
};
class ManualExecutor : public cfExecutor
{
std::mutex lock_; // avoid multiple entity updating the function container
std::queue<Func> funcs_; // functions queued for running
public:
std::map<int8_t, Func> funcs; // Function container (priority,Func) - added functions to this Executors
ManualExecutor() {}
ManualExecutor(ManualExecutor&& other):
funcs(std::move(other.funcs))
{}
~ManualExecutor() {}
void add(Func callback);
void add(std::vector<Variant> params, Func callback);
};
然后我想在函数中添加可变参数 - 像这样:
using Func = std::function<std::vector<unsigned char>(const auto&...args)>;
但是我得到隐式错误 [隐式模板可能不是“虚拟”]
我应该如何使用可变参数定义 add 函数??
到目前为止,我已经使用以下方法解决了它:
using Func = std::function<std::vector<unsigned char>(std::vector<Variant>)>;
然后让 lambda 函数处理来自向量内部的接收参数 - 如下所示:
auto lambdaFunction = [](std::vector<Variant> vec){
std::vector<unsigned char> result;
cout << "- Hello from executor - lambdaFunction ";
std::cout << ": parameters : ";
for(auto a: vec) {
std::cout << a << ",";
}
std::cout << std::endl;
std::string s("this is the result");
result.insert(result.end(),s.begin(), s.end());
return result;
};
【问题讨论】:
-
当您使用
auto ...时,Func不是具体类型。您需要将其设为模板别名,如:template<typename ... Ts> using Func = std::function<xyz(Ts const & ...)>; -
您想将具有不同签名的函数添加到同一个cfExecuror,还是具有相同可变参数签名的函数,或其他?
-
不同的签名会很好,但到目前为止我只想拥有接受可变参数的函数
-
@serup:你的目标和目标是什么?你想用这个做什么?我觉得如果你以不同的方式接近你的目标,你可能甚至不必用
virtual函数编写这个类。 -
@Nawaz,我有几个不同的执行器,一个叫做 ManualExecutor - 它工作正常,但是现在我想向我添加到执行器的函数添加参数 - 执行器正在执行承诺/未来
标签: c++ std-function variadic-functions