如何将可变参数传递给虚函数
how to pass variadic params to virtual function
我有一个可用的虚拟函数 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'
。
您可能想要执行以下操作:
template<typename ... Args >
using Func =std::function<std::vector<unsigned char>(const Args&...args)>;
template<typename ... Args >
class cfExecutor {
public:
cfExecutor();
virtual ~cfExecutor();
virtual void add(Func<Args...>) = 0;
};
您似乎想传递一个绑定函数。
这可以通过 std::bind
来完成。您不需要以任何方式更改 add
或添加基于 vector<variant>
的重载。只需按如下方式调用它:
std::vector<unsigned char> myfunction (int, const char*, Foo&);
...
int i = 123;
const char* s = "abc";
Foo foo{1,2,3};
executor->add(std::bind(myfunction, i, s, foo));
将它与常规函数、成员函数、function-like 对象 ("functors") 或 lambda 一起使用。对于内联 lambda,它没有多大意义,因为您可以在 lambda 本身中捕获数据。
executor->add([&i,s,&foo](){ ... use(i); use(s); use(foo); }
事实上,您总是可以用 lambda
替换 bind
表达式,这样可读性更好。比较:
int foo;
std::bind(std::operator<<, std::cout, foo);
对
[foo]() { return std::cout << foo; }
我有一个可用的虚拟函数 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'
。
您可能想要执行以下操作:
template<typename ... Args >
using Func =std::function<std::vector<unsigned char>(const Args&...args)>;
template<typename ... Args >
class cfExecutor {
public:
cfExecutor();
virtual ~cfExecutor();
virtual void add(Func<Args...>) = 0;
};
您似乎想传递一个绑定函数。
这可以通过 std::bind
来完成。您不需要以任何方式更改 add
或添加基于 vector<variant>
的重载。只需按如下方式调用它:
std::vector<unsigned char> myfunction (int, const char*, Foo&);
...
int i = 123;
const char* s = "abc";
Foo foo{1,2,3};
executor->add(std::bind(myfunction, i, s, foo));
将它与常规函数、成员函数、function-like 对象 ("functors") 或 lambda 一起使用。对于内联 lambda,它没有多大意义,因为您可以在 lambda 本身中捕获数据。
executor->add([&i,s,&foo](){ ... use(i); use(s); use(foo); }
事实上,您总是可以用 lambda
替换 bind
表达式,这样可读性更好。比较:
int foo;
std::bind(std::operator<<, std::cout, foo);
对
[foo]() { return std::cout << foo; }