想象一下,我想编写一个函数来处理两个函数的值(例如比较)。
f1 和 f2 是示例,但它应该适用于更多功能,与参数的数量和类型无关。
double f1 (double x, double y, double z) {
return pow(x,3)+2*pow(y,2)+3*z;
}
double f2 (std::vector<double> vec) {
double result;
for (int i=0; i<vec.size(); i++){
result += vec[i];
}
return result;
}
现在我想要一个可以像这样(或类似)调用的比较函数:
int main() {
std::vector<double> example_vector {1,3,3,7};
compare(f1, {4, 5, 6}, f2, example_vector);
return 0
}
在里面比较它会调用 f1 与 x=4、y=5、z=6 和 f2 与 vec=example_vector。
编辑:
这是我最后使用的解决方案:
#include <iostream>
#include <tuple>
#include <utility>
#include <math.h>
#include <vector>
template<typename FuncA, typename FuncB, typename ...FA_Params, typename ...FB_Params>
void do_sth(FuncA &func_a, FuncB &func_b, const std::tuple<FA_Params ...> &a_params, const std::tuple<FB_Params ...> &b_params) {
std::cout << std::apply(func_a, a_params) << std::endl;
std::cout << std::apply(func_b, b_params) << std::endl;
}
//f1, f2 and f3 are example functions
double f1 (double x, double y, double z) {
return pow(x,3)+2*pow(y,2)+3*z;
}
double f2 (std::vector<double> vec) {
double result;
for (int i=0; i<vec.size(); i++){
result += vec[i];
}
return result;
}
double f3 (double a, double omega, double t, double delta) {
double result;
result = a*sin(omega*t+delta);
}
int main() {
do_sth(f1, f2, std::make_tuple(1.0, 2.3, 1.3), std::make_tuple(std::vector<double>{1.0, 2, 3}));
return 0;
}
C++20 对我还不起作用,这只需要 C++17。
do_sth 应该能够采取任何功能