📅  最后修改于: 2023-12-03 14:51:15.315000             🧑  作者: Mango
在C++中,我们可以使用函数指针或者函数对象来表示函数。而绑定函数和占位符是一个非常强大的技术,它可以将一个函数和一些参数绑定成一个新的函数,这个新的函数就像是原来的函数被固定了一些参数一样。
我们先来看一个简单的例子,假设我们有一个函数 add
:
int add(int a, int b)
{
return a + b;
}
现在我们想要创建一个新的函数 add5
,它将 add
函数的第一个参数绑定成 5,那么我们可以使用 std::bind
来实现:
auto add5 = std::bind(add, 5, std::placeholders::_1);
这里,std::placeholders::_1
表示占位符,它将在调用 add5
函数时被替换成真实的参数。现在我们调用 add5
函数:
int result = add5(3);
这个表达式的值就是 add(5, 3)
的返回值,也就是 8。
现在我们来看一个绑定成员函数的例子,假设我们有一个类 MyClass
:
class MyClass
{
public:
int add(int a, int b)
{
return a + b;
}
};
我们想要创建一个对象,并将它的成员函数 add
绑定成一个新的函数,那么可以这样写:
MyClass obj;
auto myAdd = std::bind(&MyClass::add, &obj, std::placeholders::_1, std::placeholders::_2);
这里,&MyClass::add
表示成员函数的地址,&obj
表示对象的地址。现在我们调用 myAdd
函数:
int result = myAdd(3, 4);
这个表达式的值就是 obj.add(3, 4)
的返回值,也就是 7。
另外一种比较常见的用法是绑定一个函数对象,比如我们有一个加法器函数对象 Adder
:
class Adder
{
public:
int operator()(int a, int b)
{
return a + b;
}
};
我们可以通过下面的方式绑定这个函数对象:
Adder adder;
auto add5 = std::bind(adder, 5, std::placeholders::_1);
现在我们调用 add5(3)
,这个表达式的值就是 adder(5, 3)
的返回值,也就是 8。
除了 std::bind
,我们还可以使用 Lambda 表达式来实现绑定函数和占位符的功能。比如我们可以这样写:
auto add5 = [](int x) { return add(5, x); };
auto myAdd = [&obj](int x, int y) { return obj.add(x, y); };
其实这两个 Lambda 表达式和之前的代码等价,只不过省略了 std::bind
。
绑定函数和占位符是一个非常方便的技术,它可以在不改变原函数接口的情况下,创建出新的函数。有了它,我们可以在编写复杂的程序时更加方便地处理逻辑。