Jak przekazać metodę klasy X do funkcji?

0

Mam coś takiego:

class KlasaX
{
    Y y;
};

Potrzebuję takiej funkcjonalności aby w KlasieX coś takiego zrobić:

metodaX(&Y::metodaY)
...
void KlasaX::metodaX(std::function<void(Y*)> metodaY) {
    y.metodaY();
    ....
}

Błąd jaki mam to:
y has no member named 'metodaY'
co nie jest prawdą bo jest taka metoda, tylko w tym ciężkim C++ składnie jakąś trzeba inaczej podać.

Takie coś też mi nie działa:

void KlasaX::metodaX(void (Y::*metodaY)(void)) {
    y.metodaY();
    ....
}
8

To jest całkiem proste.

#include <iostream>

class Y
{
public:
    void metodaY()
    {
        std::cout << "Jestem Y" << std::endl;
    }

    void metodaY2()
    {
        std::cout << "Jestem Y 2" << std::endl;
    }
};

class KlasaX
{
public:
    void metodaX( void( Y::*fun )() );

private:
    Y y;
};

void KlasaX::metodaX( void( Y::*fun )() )
{
    ( y.*fun )();
}


int main()
{
    KlasaX x;
    x.metodaX( &Y::metodaY );
    x.metodaX( &Y::metodaY2 );
}

https://godbolt.org/z/W5avcsaGr

Nazywa się to member function pointer.

https://en.cppreference.com/w/cpp/language/pointer (zjedź do Pointers to member functions)

1

Wersja bardziej uniwersalna:

class KlasaX {
public:
    template <typename F>
    void metodaX(F&& f)
    {
        std::invoke(std::forward<F>(f), &y);
    }

private:
    Y y;
};

https://godbolt.org/z/9fMj38c8G

0

zastanawiam się do czego to można wykorzystać ?
dlaczego nie wywołać po prostu metody z obiektu

    x.y.metodaY();
    x.y.metodaY2();

oczywiście pod warunkiem że y jest dostępne

1 użytkowników online, w tym zalogowanych: 0, gości: 1