«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать общие обратные вызовы C ++ с использованием членов класса и `std :: function`?

Как реализовать общие обратные вызовы C ++ с использованием членов класса и `std :: function`?

Опубликовано в 2025-03-22
Просматривать:882

How to Implement Generic C   Callbacks Using Class Members and `std::function`?

c обратный вызов с использованием члена класса с общей реализацией

исходный вопрос, направленный на создание общего механизма обработки событий, который будет работать последовательно в разных классах. Вместо того, чтобы полагаться на статические методы и передавать указатели экземпляра класса, более современный C -подход можно использовать с использованием std :: function и std :: bind.

обработчик событий с функцией std :: function

класс обработчика событий теперь принимает объект fund :: функция как аргумент. Функциональный объект представляет собой вызываемая сущность, которая может быть передана как регулярная указатель функции. Метод обработчика событий addHandler принимает функцию std :: function > в качестве аргумента, где передача функция не имеет возвращаемого значения и принимает целое число в качестве аргумента. { публика: void addhandler (std :: function обратный вызов) { cout

class EventHandler
{
public:
    void addHandler(std::function callback)
    {
        cout  

для привязки конкретного метода класса с обработчиком событий, std :: bind используется. std :: bind Указывает этот указатель и функцию, которую можно вызвать при запуска событий.

класс MyClass { публика: Myclass (); // Примечание: больше не отмечается «static» и только принимает фактический аргумент void обратный вызов (int x); частный: int private_x; }; Myclass :: myclass () { Использование пространства имен Std :: Placeholders; // для `_1` private_x = 5; Handler-> addHandler (std :: bind (& myclass :: обратный вызов, это, _1)); } void myclass :: обратный вызов (int x) { // больше не нуждается в явном аргументе `encess`, // как `this` настроен правильно cout

class MyClass
{
public:
    MyClass();

    // Note: No longer marked `static`, and only takes the actual argument
    void Callback(int x);
private:
    int private_x;
};

MyClass::MyClass()
{
    using namespace std::placeholders; // for `_1`

    private_x = 5;
    handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}

void MyClass::Callback(int x)
{
    // No longer needs an explicit `instance` argument,
    // as `this` is set up properly
    cout  

, если обратный вызов-это свободная функция без контекста класса, std :: bind не требуется.

void freestandingCallback (int x) { // ... } int main () { // ... Handler-> addhandler (FreestingCallback); }

void freeStandingCallback(int x)
{
    // ...
}

int main()
{
    // ...
    handler->addHandler(freeStandingCallback);
}

Handler-> addHandler ([] (int x) {std :: cout ]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3