我正在尝试在用户定义的函数和数据之间创建一个接口(interface)。假设我需要创建一个名为 MapFun()
的函数,MapFun()
的输入包括用户定义函数 (UDF) 句柄和 UDF 输入。
void userFun1(Data data, int in1, int in2){
// user defined function 1;
}
void userFun2(Data data, int in1, int in2, std::string s){
// user defined function 2;
}
// ...
// apply user function 1 on data
MapFun(@userFun1, data, 3, 4);
// apply user function 2 on data
MapFun(@userFun2, data, 1, 2, "algorithm");
用户将编写 userFun
并将其与 MapFun()
一起应用。那么,如何设计MapFun()
呢?用户函数可能有不同的输入,签名无法预测。此外,MapFun()
不会立即计算 userFun
,而是存储所有 userFun
并进行惰性计算。
非常感谢任何建议。
最佳答案
User function may have different inputs and the signature can't be predicted.
这似乎是可变参数模板的典型作品
In addition,
MapFun()
won't evaluateuserFun
immediately, instead, it stores alluserFun
and do a lazy evaluation.
不确定是否理解,但我想您可以使用 std::bind()
或使用 lambda 函数获得您想要的东西。
我建议使用以下 C++14 可变参数模板 MapFun()
函数,它返回一个捕获用户函数和参数的 lambda 函数。该函数可以稍后执行。
template <typename F, typename ... Args>
auto MapFun (F const & f, Args const & ... args)
{ return [=]{ f(args...); }; }
下面是一个完整的工作示例
#include <iostream>
template <typename F, typename ... Args>
auto MapFun (F const & f, Args const & ... args)
{ return [=]{ f(args...); }; }
void userFun1 (int i1, int i2)
{ std::cout << "uf1, " << i1 << ", " << i2 << std::endl; }
void userFun2 (int i1, int i2, std::string const & s)
{ std::cout << "uf2, " << i1 << ", " << i2 << ", " << s << std::endl; }
int main ()
{
auto l1 = MapFun(userFun1, 1, 2);
auto l2 = MapFun(userFun2, 3, 4, "five");
l2();
l1();
}
关于C++需要一个容器来存储用户定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272335/