探索 C 中的 Operator() 重载:函子和泛型编程
C 中重载 () 运算符,如 Boost 信号中所示图书馆,提出了关于其目的和惯例的问题。让我们深入探讨这种做法背后的原因。
函子:桥接函数和对象世界
Operator() 重载在创建函子(一种独特的构造)方面发挥着至关重要的作用它将类似函数的行为与状态性结合起来。函子在调用之间保持其内部状态,使它们能够记住过去的操作。
函子示例
考虑以下累加器函子:
struct Accumulator { int counter = 0; int operator()(int i) { return counter += i; } };
泛型编程:插入逻辑
函子在泛型编程中有着广泛的应用,其中算法使用用户提供的函数或函子对一系列元素进行操作。这种灵活性在 std::for_each 算法中得到了证明:
template <typename InputIterator, typename Functor> void for_each(InputIterator first, InputIterator last, Functor f) { while (first != last) f(*first++); }
Operator() 的便利
operator() 重载允许函子和函数指针插入通用算法。例如,考虑这个例子:
void print(int i) { std::cout << i << std::endl; } ... std::vector<int> vec; // Fill vec // Using a functor Accumulator acc; std::for_each(vec.begin(), vec.end(), acc); // acc.counter contains the vector sum // Using a function pointer std::for_each(vec.begin(), vec.end(), print); // prints all elements
多个 () 运算符:一种可能性
与普遍的看法相反,确实可以重载多个 () 运算符一次在一个班级。遵守方法重载规则,返回类型必须不同。
以上是为什么在 C 中重载 `operator()` ?函子和泛型编程的力量的详细内容。更多信息请关注PHP中文网其他相关文章!