C++ манипуляции с методами

225
29 декабря 2018, 05:00

В C#:

myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);
void HandleSomethingHappened(string foo) {
}

Как играть в подобном тоне на C++? Как создать некий EventHandler которому можно кормить метод и потом где небудь из него брать собственно етот метод? Хочу создать клас, обьекту которого можно было бы как-небудь указывать что он будет делать а не с чем он будет что-небудь делать.

Answer 1

Используйте класс-оболочку Function для хранения метода, а его экземпляр храните в EventHandler. По поводу реализации Function: не знаю, как заставить объект вызываться как функцию (наверное, переопределение операторов). Хранение как поле объекта решает проблему вытаскивания метода куда-то ещё.

Answer 2

Я так понимаю вам нужно что-то подобное, в данном примере классу присваевается указатель на лямбду и выполняется действие

// Example program
#include <iostream>
class Method 
{
public:
    Method(int (*fptr)(int, int))
    {
        this->bar = fptr;
    }
    void SetFunction(int (*fptr)(int, int))
    {
        this->bar = fptr;
    }
    //В данном случае GetFunction это имя функции
    int (*GetFunction())(int, int)
    {
        return this->bar;
    }
private:
    //Сам наш указатель вообщем то
    int (*bar)(int, int);
};
int main()
{
    //Пример с со сложением
    Method test
    (
        [](int x, int y)
        {
            return x+y;
        }
    );
    std::cout << test.GetFunction()(10,10) << std::endl;
    //Пример с умножением
    test.SetFunction
    (
        [](int x, int y)
        {
            return x*y;
        }
    );
    std::cout << test.GetFunction()(10,10) << std::endl;
}
READ ALSO
Почему атрибут не добавляется в модель?

Почему атрибут не добавляется в модель?

Не судите строго, ошибка в какой-то мелочи наверноеЕсть view

173
Как показать изображение оффлайн в FirebaseDatabase

Как показать изображение оффлайн в FirebaseDatabase

Вот мой код! Приложение запоминает имя и статус чтобы показать их оффлайн но как мне сохранить изображение чтобы показать их оффлайнЗаранее...

181
Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Я запускаю Jetty сервер и пытаюсь зарегистрировать сервлетВот в таком виде все работает:

176
Fullscreen при смене одного Activity на другое Activity

Fullscreen при смене одного Activity на другое Activity

Пытаюсь сделать приложение на полный экран (для всех активити)Создал абстрактный FullscreenActivity и наследую от него остальные активити

177