C函数对象与仿函数函数对象是重载了函数调用运算符operator()的类对象也称为仿函数。它们可以像函数一样被调用但比普通函数更灵活可以保存状态和配置。函数对象的基本实现通过重载operator()实现。#include#include#includeclass Multiplier {int factor_;public:explicit Multiplier(int factor) : factor_(factor) {}int operator()(int x) const {return x * factor_;}};void basic_functor_example() {Multiplier times_two(2);Multiplier times_three(3);std::cout 5 * 2 times_two(5) \n;std::cout 5 * 3 times_three(5) \n;std::vector numbers {1, 2, 3, 4, 5};std::transform(numbers.begin(), numbers.end(), numbers.begin(), times_two);std::cout Doubled: ;for (int n : numbers) {std::cout n ;}std::cout \n;}函数对象可以保存状态这是它们相比普通函数的主要优势。class Counter {mutable int count_;public:Counter() : count_(0) {}void operator()() const {count_;}int get_count() const {return count_;}};void stateful_functor_example() {Counter counter;for (int i 0; i 10; i) {counter();}std::cout Function called counter.get_count() times\n;}谓词函数对象返回布尔值常用于STL算法中的条件判断。class GreaterThan {int threshold_;public:explicit GreaterThan(int threshold) : threshold_(threshold) {}bool operator()(int value) const {return value threshold_;}};class InRange {int min_, max_;public:InRange(int min, int max) : min_(min), max_(max) {}bool operator()(int value) const {return value min_ value max_;}};void predicate_functor_example() {std::vector numbers {1, 5, 10, 15, 20, 25, 30};auto it std::find_if(numbers.begin(), numbers.end(), GreaterThan(15));if (it ! numbers.end()) {std::cout First number 15: *it \n;}int count std::count_if(numbers.begin(), numbers.end(), InRange(10, 20));std::cout Numbers in range [10, 20]: count \n;}比较函数对象用于定义排序和查找的顺序。struct Person {std::string name;int age;};class CompareByAge {public:bool operator()(const Person a, const Person b) const {return a.age b.age;}};class CompareByName {public:bool operator()(const Person a, const Person b) const {return a.name b.name;}};void comparison_functor_example() {std::vector people {{Alice, 30},{Bob, 25},{Charlie, 35}};std::sort(people.begin(), people.end(), CompareByAge());std::cout Sorted by age:\n;for (const auto p : people) {std::cout p.name ( p.age )\n;}std::sort(people.begin(), people.end(), CompareByName());std::cout Sorted by name:\n;for (const auto p : people) {std::cout p.name ( p.age )\n;}}函数对象可以组合使用实现复杂的逻辑。templateclass Not {Predicate pred_;public:explicit Not(Predicate pred) : pred_(pred) {}templatebool operator()(const T value) const {return !pred_(value);}};templateclass And {Pred1 pred1_;Pred2 pred2_;public:And(Pred1 p1, Pred2 p2) : pred1_(p1), pred2_(p2) {}templatebool operator()(const T value) const {return pred1_(value) pred2_(value);}};void composed_functor_example() {std::vector numbers {1, 5, 10, 15, 20, 25, 30};auto not_greater_than_15 Not(GreaterThan(15));int count std::count_if(numbers.begin(), numbers.end(), not_greater_than_15);std::cout Numbers 15: count \n;auto in_range_and_even And(InRange(10, 25),[](int x) { return x % 2 0; });count std::count_if(numbers.begin(), numbers.end(), in_range_and_even);std::cout Even numbers in [10, 25]: count \n;}函数对象可以实现策略模式允许运行时选择算法。class SortStrategy {public:virtual ~SortStrategy() default;virtual void sort(std::vector data) const 0;};class BubbleSort : public SortStrategy {public:void sort(std::vector data) const override {for (size_t i 0; i data.size(); i) {for (size_t j 0; j data.size() - i - 1; j) {if (data[j] data[j 1]) {std::swap(data[j], data[j 1]);}}}}};class QuickSortStrategy : public SortStrategy {void quick_sort(std::vector data, int low, int high) const {if (low high) {int pivot data[high];int i low - 1;for (int j low; j high; j) {if (data[j] pivot) {i;std::swap(data[i], data[j]);}}std::swap(data[i 1], data[high]);int pi i 1;quick_sort(data, low, pi - 1);quick_sort(data, pi 1, high);}}public:void sort(std::vector data) const override {if (!data.empty()) {quick_sort(const_cast(data), 0, data.size() - 1);}}};class Sorter {const SortStrategy* strategy_;public:explicit Sorter(const SortStrategy* strategy) : strategy_(strategy) {}void sort(std::vector data) const {strategy_-sort(data);}};void strategy_pattern_example() {std::vector data1 {5, 2, 8, 1, 9};std::vector data2 {5, 2, 8, 1, 9};BubbleSort bubble;QuickSortStrategy quick;Sorter sorter1(bubble);sorter1.sort(data1);Sorter sorter2(quick);sorter2.sort(data2);std::cout Bubble sorted: ;for (int n : data1) std::cout n ;std::cout \n;std::cout Quick sorted: ;for (int n : data2) std::cout n ;std::cout \n;}函数对象可以用于实现回调机制。#includeclass EventEmitter {std::vector listeners_;public:void on(std::function listener) {listeners_.push_back(listener);}void emit(int value) {for (auto listener : listeners_) {listener(value);}}};class Logger {public:void operator()(int value) const {std::cout Logged: value \n;}};class Validator {int max_value_;public:explicit Validator(int max) : max_value_(max) {}void operator()(int value) const {if (value max_value_) {std::cout Warning: value value exceeds maximum\n;}}};void callback_functor_example() {EventEmitter emitter;emitter.on(Logger());emitter.on(Validator(100));emitter.on([](int value) {std::cout Lambda received: value \n;});emitter.emit(50);emitter.emit(150);}函数对象可以实现延迟计算和记忆化。templateclass Memoized {mutable std::map cache_;Func func_;public:explicit Memoized(Func f) : func_(f) {}int operator()(int x) const {auto it cache_.find(x);if (it ! cache_.end()) {std::cout Cache hit for x \n;return it-second;}std::cout Computing for x \n;int result func_(x);cache_[x] result;return result;}};int expensive_computation(int x) {return x * x;}void memoization_example() {Memoized memoized(expensive_computation);std::cout Result: memoized(5) \n;std::cout Result: memoized(5) \n;std::cout Result: memoized(10) \n;}STL提供了预定义的函数对象如plus、minus、multiplies等。#include#includevoid stl_functors_example() {std::vector numbers {1, 2, 3, 4, 5};int sum std::accumulate(numbers.begin(), numbers.end(), 0, std::plus());std::cout Sum: sum \n;int product std::accumulate(numbers.begin(), numbers.end(), 1, std::multiplies());std::cout Product: product \n;std::transform(numbers.begin(), numbers.end(), numbers.begin(),std::bind(std::multiplies(), std::placeholders::_1, 2));std::cout Doubled: ;for (int n : numbers) {std::cout n ;}std::cout \n;}函数对象是C中实现灵活、可配置行为的重要工具它们在STL算法、回调系统和策略模式中广泛应用。