如何传递缺少参数的函数?

时间:2015-03-31 06:54:04

标签: c++ c function

我有一个以double (*function)(double t, double y)为参数的过程。现在我有一个像double fce (double t, double y, int a)这样的函数,我希望将它传递给我的程序,其中包含一个填充参数,类似于fce (, , 5)以使其成为double fce (double t, double y),但我无法找到方法C或C ++。

3 个答案:

答案 0 :(得分:3)

考虑编写一个variadic function,或许可以让你能够传递不同数量的值。

答案 1 :(得分:3)

中(因为您询问过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);

中,您可以通过编写新的转换器功能

来完成此操作
/* 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模板

BTW,闭包(和匿名函数)非常方便,functional programming种语言需要garbage collector才能方便地处理它们。这样的事情很多更容易编码,例如Ocaml,Clojure,Common Lisp,Haskell等....