C++ 可调用对象(Callable Object)深入分析
可调用对象是一个对象,它能够像函数一样被调用,包括函数指针、函数对象、成员函数指针等。在 C++11 标准中加入的可调用对象是一个非常强大的特性,我们可以利用它来编写更加灵活和高效的代码。
本文将深入介绍 C++ 中可调用对象的概念、用法以及注意事项。其中会包含两个示例,以帮助读者更好地理解可调用对象的使用。
可调用对象类型
可调用对象类型包括众多的类型,包括函数指针、函数对象、成员函数指针等。在 C++ 调用可调用对象时,它会自动转换为一个函数的形式,从而可以被调用。以下是可调用对象的一些例子:
- 函数指针
int (*func)(int) = &some_function; // 函数指针声明及赋值
int result = func(42); // 通过函数指针调用函数
- Lambda 表达式
auto lambda = [](int a, int b) { return a + b; }; // Lambda 表达式声明及赋值
int result = lambda(1, 2); // 通过 Lambda 表达式调用函数
- 仿函数(函数对象)
struct Functor {
int operator()(int a, int b) const { return a + b; } // 仿函数声明
};
Functor functor; // 仿函数对象实例化
int result = functor(1, 2); // 通过仿函数调用函数
- 成员函数指针
struct SomeClass {
int some_function(int a, int b) { return a + b; } // 成员函数声明
};
int (SomeClass::*member_func_ptr)(int, int) = &SomeClass::some_function; // 成员函数指针声明及赋值
SomeClass obj;
int result = (obj.*member_func_ptr)(1, 2); // 通过成员函数指针调用函数
- std::function
std::function<int(int, int)> func = [](int a, int b) { return a + b; }; // std::function 声明及赋值
int result = func(1, 2); // 通过 std::function 调用函数
使用可调用对象
可调用对象可以作为函数参数或函数返回值来使用,从而使得我们的代码更加灵活和高效。
作为函数参数
使用可调用对象作为函数参数的情景比较常见,例如 STL 中的算法函数就会将可调用对象作为函数参数传入,例如 std::sort 函数:
template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);
其中的 Compare 参数就是一个可调用对象类型,其作用是用于比较两个元素的大小。我们可以传入一个函数指针、Lambda 表达式或者仿函数作为 Compare 参数,例如:
bool greater(int a, int b) { return a > b; } // 普通函数声明
auto lambda = [](int a, int b) { return a > b; }; // Lambda 表达式声明
struct Functor { bool operator()(int a, int b) const { return a > b; } }; // 仿函数声明
std::vector<int> vec = {2, 5, 1, 7};
std::sort(vec.begin(), vec.end(), greater); // 使用函数指针作为函数参数
std::sort(vec.begin(), vec.end(), lambda); // 使用 Lambda 表达式作为函数参数
std::sort(vec.begin(), vec.end(), Functor{}); // 使用仿函数作为函数参数
作为函数返回值
使用可调用对象作为函数返回值的情况比较特殊,它常常用于封装一些策略,例如工厂模式。在这种情况下,我们可以利用可调用对象来生成一个新的对象。
以下是一个示例,我们定义了一个名为 make_adder 的函数,该函数接受一个整数作为参数,返回一个 Lambda 表达式,用于把该整数加上其他数:
auto make_adder(int n) {
return [n](int x) { return n + x; }; // Lambda 表达式创建
}
auto add5 = make_adder(5); // 使用 make_adder 函数创建一个新的可调用对象
int result = add5(3); // 调用可调用对象
上述示例中,我们创建了一个新的可调用对象 add5
,该对象可以将传入的整数加上 5。我们可以将这个对象保存下来,并在需要的时候反复使用。
总结
可调用对象是 C++11 中的一个非常强大的特性,我们可以使用函数指针、Lambda 表达式、仿函数或成员函数指针来创建可调用对象,并且可以将其作为函数参数或函数返回值使用,使代码更加灵活和高效。
我们在本文中介绍了可调用对象的概念和使用方法,并提供了两个示例来说明其使用场景和注意事项。希望本文能够帮助大家更好地理解和使用可调用对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++可调用对象callable object深入分析 - Python技术站