C++ 使用参数化函数c++; int foo(int x, int y){ return x+y ; }

C++ 使用参数化函数c++; int foo(int x, int y){ return x+y ; },c++,function,function-pointers,C++,Function,Function Pointers,有没有办法创建此函数的“参数化”版本 我的意思是,从foo()开始,我想定义y固定为特定值的函数指针,相当于创建函数foo2(),如下所示: int foo2(int x){ return foo(x,2); } 如果不使用函数指针,哪种方法可以替代类似的行为?您可以使用修复(或)函数参数 例如,foo2可以是 auto foo2 = std::bind(foo, std::placeholders::_1, 2); 你可以这样理解: 调用foo2类似于调用foo,其中第一个参数是foo

有没有办法创建此函数的“参数化”版本

我的意思是,从foo()开始,我想定义y固定为特定值的函数指针,相当于创建函数foo2(),如下所示:

int foo2(int x){
  return foo(x,2);
}
如果不使用函数指针,哪种方法可以替代类似的行为?

您可以使用修复(或)函数参数

例如,
foo2
可以是

auto foo2 = std::bind(foo, std::placeholders::_1, 2);
你可以这样理解:

调用
foo2
类似于调用
foo
,其中第一个参数是
foo2
调用的第一个参数,第二个参数是
2

可以使用lambda函数执行以下操作:

auto foo2 = [] (int x) { return foo(x, 2); }


最后,如果您不能使用C++11,那么还有一个等价的方法。

您可以使用

int foo(int x) {
    return foo(x,2);
}

你会有相同的名字。。。或者默认的参数解决方案…

函数指针不支持这种类型的任何东西。事实上,它们所支持的只是指向静态函数。不要将它们用于回调,而是使用
std::function
或模板


您可以使用
std::bind
或lambda来实现此目标。但是您不会得到函数指针,只能得到函数对象,您可以通过适当的抽象(模板或
std::function
)使用它。

您可以使用std::bind,例如:

std::bind2nd (std::ptr_fun (foo), arg2) (arg1) // replace second argument
std::bind1st (std::ptr_fun (foo), arg1) (arg2) // replace/bind first argument
您还可以将其分配给变量:

auto fun = std::bind1st (std::ptr_fun (foo), 2);
auto fun = std::bind2nd (std::ptr_fun (foo), 2);
或者如果您的编译器不支持C++11

typedef std::binder1st<std::pointer_to_binary_function<int, int, int>> fun_type;
fun_type fun = std::bind1st (std::ptr_fun (foo), 2); // foo (2, arg2);


typedef std::binder2nd<std::pointer_to_binary_function<int, int, int>> fun_type2;
fun_type2 fun = std::bind2nd (std::ptr_fun (foo), 2); // foo (arg1, 2);

谢谢所以我要找的是编程中的“绑定”吗?此外,我希望避免使用boost库。据您所知,带有-std=c+11标志的g++是否支持绑定?@LucaCerone:binding是一个可以使用的术语,但是如果您正在搜索它,“固定参数”和“currying”会更好。g++支持C++11,所以它确实支持这些解决方案(我已经添加了一个到实时代码的链接)。谢谢Jon,不幸的是,我的编译器还不支持C++11。(这是GCC4.6,4.7中引入了对c++11的支持。我将尝试更新,但我不想冒我的旧程序出现问题的风险…@LucaCerone:c++03最简单的解决方案是使用
boost::bind
,它使用几乎完全相同的语法(您需要指定返回值的类型——使用
boost::function
作为类型,有关更多信息,请参阅)。或者,根据tozka的答案,您可以使用标准C++03语法,但这只适用于简单的情况,可读性稍差。感谢@tozka,我发现您的答案有点难以理解,尽管我可以大致了解。。
fun (arg);