我有一个以double (*function)(double t, double y)
为参数的过程。现在我有一个像double fce (double t, double y, int a)
这样的函数,我希望将它传递给我的程序,其中包含一个填充参数,类似于fce (, , 5)
以使其成为double fce (double t, double y)
,但我无法找到方法C或C ++。
答案 0 :(得分:3)
考虑编写一个variadic function,或许可以让你能够传递不同数量的值。
答案 1 :(得分:3)
在c++中(因为您询问过C或C ++),您可以使用std::bind执行此操作。
查看this answer了解详情。
using namespace std::placeholders; // for _1, _2, _3...
// Fix first argument as 10
auto fce_third_arg_is_5 = bind(fce, 5, _3);
/* foo(function); */
foo(fce_third_arg_is_5);
在c中,您可以通过编写新的转换器功能
来完成此操作/* Can be used only in global scope */
#define GEN_FUNC(X) double templated_fn_##X(double t, double y) {return fce(t, y, X);}
GEN_FUNC(5);
...
/* foo(function); */
foo(templated_fn_5);
或通用解决方案:
static int a_val_g;
static double wrapper(double t, double y)
{
return fce(t, y, a_val_g);
}
function make_func(int a) {
/* Warning: Not thread safe. Subsequent call will invalidate previously returned function */
/* fn(make_func(i), make_func(42); is bad */
/* Using make_func in a multithreaded application is unsafe unless synchronized properly */
a_val_g = a;
return wrapper;
}
...
/* foo(function); */
foo(make_func(5));
答案 2 :(得分:1)
C和C ++在这方面是非常不同的语言。
你可能想要一个closure(或者在C或旧的C ++ 98中使用if-like,你没有它们,有一个callback机制,所以传递一个函数指针和一些额外的数据)
在C ++中,您需要使用C++11标准(例如,使用g++ -std=c++11
)atr至少,它提供匿名lambda functions - 闭包 - 和std::function
模板