想象一下,我想编写一个函数来对两个函数的值做一些事情(例如比较)。
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
}
在内部比较中,它将调用x = 4,y = 5,z = 6的f1和vec = example_vector的f2。
编辑:
这是我最后使用的解决方案:
#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应该能够执行任何功能
我在这里看不到目标,因此很难使其成为通用解决方案,但基本上您可以执行以下操作:
template<typename FuncA, typename FuncB>
void compare(FuncA func_a, const std::vector<double> &vec_a, FuncB func_b, const std::vector<double> &vec_b) {
double res1 = func_a(vec_a[0], vec_a[1], vec_a[2]);
double res2 = func_b(vec_b);
// Do something...
}
可能有更多通用的解决方案可以执行您想要的操作,但是您必须澄清目标。
顺便说一下,关于f2
:
double f2(std::vector<double> vec);
您可以通过引用/ const引用传递向量以避免数据复制:
double f2(const std::vector<double> &vec);
template<typename FuncA, typename FuncB, typename FB_Param, typename ...FA_Params>
void compare(FuncA func_a, FuncB func_b, FB_Param b_param, FA_Params ...a_params) {
func_a(a_params...);
func_b(b_param);
}
该呼叫可能看起来像这样:
compare(f1, f2, std::vector<double>{1.0, 2, 3}, 1.0, 2.3, 1.3);
但是要注意的最重要的一点是,您不能在同一个函数中合并两个可变参数,因此传递给此函数的函数之一应接受单个参数(在此示例中为func_b)。
由于@ fT3g0的想法是将元组用于多个值,因此这是我的c ++ 20版本:将参数传递为std :: tuples / std :: arrays / std :: pair /支持std :: apply实现的任何东西
template<typename Type>
concept ApplySupporter =
requires (Type t) {
{ std::get<std::tuple_size<Type>() - 1>(t) };
{ std::tuple_size<Type>() };
};
template<typename FuncA, ApplySupporter FA_Params, typename FuncB, ApplySupporter FB_Params>
void compare(FuncA func_a, FA_Params a_params, FuncB func_b, FB_Params b_params) {
std::cout << std::apply(func_a, a_params) << std::endl;
std::cout << std::apply(func_b, b_params) << std::endl;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句