1

我想知道在 C++ 中是否有可能通过将第 n 个参数的值设置为某个值(在运行时确定)来从带 n 个参数的函数中获取 (n-1) 个参数?

例如,我想做类似以下的事情:

float foo(float a, float b, float c){
  // do some stuff
}

float bar(float x, float y, float f(float q, float r)){
  return f(x,y);
}

int main(){
  double (*function)(float, float);
  float some_value;
  // somehow determine some_value, e.g. read from stdin.
  // Now I would like to set function something along the lines of:
  function = foo( . , . , some_value)
  return bar(123, 456, function);
}

从概念上讲,foo是由 索引的函数c族,即函数族foo_c (float a, float b)(在此处将“foo_c”读为“foo 下标 c”),我想foo_c分别将指向它的指针作为参数传递给bar.

这在 C++ 中是否可能?据我所知,使用上面的函数指针是不可能的。有没有其他方法可以做这样的事情?

我曾短暂考虑过制作foo一个函数模板,但这不起作用,因为我想在运行时设置它的第三个参数。

显而易见的解决方案当然是进行修改bar,以便将类型float f(float q, float r, float t)作为其第三个参数,但这会使代码的可重用性大大降低(并且看起来不那么优雅)。我还想将其他函数传递给bar,其中一些只需要两个参数,三个以上,或者不同类型的参数,我需要在将它们传递给之前将它们设置为固定值bar

我还不太清楚bar在这种情况下template <typename T, typename S> float bar(float x, float y, T f(float a, float b, S param), S parameters)是否可以按照bar <double *(float, float, float), float> (123, 456, function, parameters). 沿着这些路线的任何东西都行得通吗?

4

2 回答 2

4

你不能用函数指针来做,但是,它可以用函数对象来做。如果您使用 C++03 ,我建议您查看Boost.Bind 。如果您使用的是 C++11,std::bind则它是标准的一部分,并且工作方式相同。C++11 还引入了内置的 lambda,可以满足您的要求。

要存储 bind 或 lambda 的结果,您可以在 C++03 或C++11 中使用Boost.Function 。std::function

这个例子是你在 C++03 中的做法。

float foo(float a, float b, float c){
  // do some stuff
}

float bar(float x, float y, boost::function<float(float,float)> f){
   return f(x,y);
}

int main(){
  boost::function<float(float,float)> func;
  float some_value;
  // somehow determine some_value, e.g. read from stdin.
  // Now I would like to set function something along the lines of:
  func= boost::bind(foo, _1, _2, some_value);
  return bar(123, 456, func);
}

在 C++11 中,您可以使用标准版本的绑定和函数,或者您可以使用 lambda 功能:

float foo(float a, float b, float c){
  // do some stuff
}

float bar(float x, float y, std::function<float(float,float)> f){
   return f(x,y);
}

int main(){
  std::function<float(float,float)> func;
  float some_value;
  // somehow determine some_value, e.g. read from stdin.
  // Now I would like to set function something along the lines of:
  func= [some_value](float x, float y) { return foo(x,y,some_value); };
  return bar(123, 456, func);
}
于 2011-10-21T10:36:21.317 回答
4

你不能用这样的函数指针来做到这一点,但你可以用类似函数的对象来做到这一点。C++11 给了你std::bindand std::function(还有 lambdas,但我对它们的了解还不够,不能举个例子);在 C++03 中,boost::bind并且boost::function非常相似。

float foo(float a, float b, float c){
  // do some stuff
}

float bar(float x, float y, function<float(float, float)> f){
  return f(x,y);
}

int main(){
  float some_value;
  // somehow determine some_value, e.g. read from stdin.

  return bar(123, 456, bind(foo,_1,_2,some_value));
}
于 2011-10-21T10:36:36.383 回答