C++ 関数ポインターの動作: 一般的なプログラミングの問題の解決

WBOY
リリース: 2024-04-29 17:33:01
オリジナル
890 人が閲覧しました

関数ポインタは、次のような C プログラミングの課題を解決する強力な方法を提供します。 比較関数: 関数ポインタを使用してカスタム コンパレータを実装し、オブジェクトの並べ替えを容易にします。イベント処理: イベントをトリガーするポインターと関数ポインターを登録することで、イベント処理システムを作成します。コールバック関数: 制御を他の関数に転送し、適切なタイミングで制御を復元してコールバック関数を実装します。

C++ 函数指针实战:解决常见编程难题

C 関数ポインタの実践: 一般的なプログラミングの問題の解決

関数ポインタは C の強力な関数であり、関数を使用できるようになります。パラメータとして配信または保存します。関数ポインターの基本概念と実際の応用を理解することで、プログラミングのさまざまな課題を効果的に解決できます。

基本概念

関数ポインターは関数へのポインターです。その型は、戻り値とパラメータの型がポインタ宣言で指定されている関数へのポインタです。例:

typedef int (*FuncPtr)(int, int);
ログイン後にコピー

これは、戻り値の型が int でパラメータが int および int である関数へのポインタを宣言します。

実践例

1. 比較関数**

関数ポインタは 2 つのオブジェクトを比較するために使用できます。次のコードは、関数ポインターを使用してカスタム コンパレーターを実装する方法を示しています:

#include <algorithm>

struct Person {
    std::string name;
    int age;
};

// 比较器函数
bool compare_by_name(const Person& lhs, const Person& rhs) {
    return lhs.name < rhs.name;
}

bool compare_by_age(const Person& lhs, const Person& rhs) {
    return lhs.age < rhs.age;
}

int main() {
    std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Carol", 32}};

    // 使用函数指针对人进行排序
    std::sort(people.begin(), people.end(), compare_by_name);
    for (auto& person : people) {
        std::cout << person.name << std::endl;
    }
    std::cout << std::endl;

    // 使用不同的函数指针对人进行排序
    std::sort(people.begin(), people.end(), compare_by_age);
    for (auto& person : people) {
        std::cout << person.name << std::endl;
    }
    return 0;
}
ログイン後にコピー

出力:

Alice
Bob
Carol

Bob
Alice
Carol
ログイン後にコピー

関数ポインターは次の目的で使用できます。イベント処理システムを作成します。次の例は、関数ポインターを使用してイベントを登録およびトリガーする方法を示しています:

#include <map>
#include <functional>

class EventManager {
public:
    // 注册事件
    template<typename Function>
    void Register(const std::string& event, Function callback) {
        callbacks[event].push_back(callback);
    }

    // 触发事件
    void Trigger(const std::string& event) {
        for (auto& callback : callbacks[event]) {
            callback();
        }
    }

private:
    std::map<std::string, std::vector<std::function<void()>>> callbacks;
};

int main() {
    EventManager manager;

    // 注册按钮点击事件
    manager.Register("button_click", []() { std::cout << "Button clicked!" << std::endl; });

    // 模拟按钮点击
    manager.Trigger("button_click");

    return 0;
}
ログイン後にコピー

出力:

Button clicked!
ログイン後にコピー

3. コールバック関数**

関数ポインターを使用して実装できます。コールバック関数を使用すると、ある関数が制御を別の関数に転送し、必要に応じて制御を取り戻すことができます。次の例は、関数ポインターを使用してコールバック関数を作成する方法を示しています。

#include <thread>

void Callback(int num) {
    std::cout << "Callback function called with argument: " << num << std::endl;
}

int main() {
    std::thread thread(Callback, 10);
    thread.join();
    return 0;
}
ログイン後にコピー

出力:

Callback function called with argument: 10
ログイン後にコピー

以上がC++ 関数ポインターの動作: 一般的なプログラミングの問題の解決の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート