C++需要一个容器来存储用户定义的函数

标签 c++ c++11 variadic-templates variadic-functions

我正在尝试在用户定义的函数和数据之间创建一个接口(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 evaluate userFun immediately, instead, it stores all userFun 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/

相关文章:

c++ - qt图表等轴(轴应该形成正方形而不是矩形)

c++ - C++11 中由 std::tuple_size 终止的递归可变参数模板

c++ - 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包

c++ - 如何使用 OpenGL 创建位图的实体挤压?

c++ - 如何创建一个简单的 cpu 基准测试?

c++ - 从 MATLAB diag(sqrt(v)) 转换为 C++ 中的 Eigen

C++11 使用代理将成员函数传递给线程

c++ - 像 int (x) 这样的声明的目的是什么?或 int (x) = 10;

c++ - 事件发射器和成员方法自动注册为监听器

c++ - 迭代 C++ 可变参数模板类型列表