Metoda jako funkcja

0

Witajcie,
mam funkcje przyjmującą następujący argument: void(pointer)(void) tzn wskaźnik na funkcje.
Czy jest jakiś sposób, aby użyć tej funkcji wewnątrz klasy, a w jej argumencie podać metodę?

0
struct Foo
  {
   void A(void *) { cout<<"A"<<endl;  }
   void B(void *) { cout<<"B"<<endl;  }
   void F(void (Foo::*pointer)(void *))
     {
      (this->*pointer)(0);
     }
  };
 
    Foo f;
    f.F(&Foo::A);
    f.F(&Foo::B);
1

Nie da się tak po prostu skonwertować wskaźnika na funkcję składową na "zwykły" wskaźnik do funkcji. (http://www.parashift.com/c++-faq/memfnptr-vs-fnptr.html)

Można to jednak łatwo zrobić za pomocą <functional> w C++11:

#include <iostream>
#include <functional>
 
void call(std::function<void (void *)> fun) {
  fun(0);    
}
 
class X {
public:
  void fun(void *) {
    std::cout << "tralala";
  }
  
  void test() {
    using namespace std::placeholders;
 
    call(std::bind(&X::fun, std::ref(*this), _1));
  }
};
 
int main() {
  X x;
  
  x.test();
  
  return 0;
}

(http://ideone.com/BXrgoN)

W test do funkcji składowej przypisuje się obiekt, na jakim ma działać (std::bind), w tym wypadku jest to obecny obiekt (a dokładniej referencja - std::ref). Po takim przypisaniu funkcja "wygląda" jak zwykła funkcja i dlatego może ją przyjąć std::function<void (void *)> (to takie uniwersalne opakowanie na funkcję) które nie wie, że tak naprawdę jest to funkcja składowa.

0

A może da się w klasie zrobić wskaźnik na funkcję, która jako argument przyjmuje wskaźnik na funkcję -> następnie przypisać do tego wskaźnika tą zewnętrzną funkcję i w metodzie wykonywać tak jakby to była zwykła funkcja przyjmująca jako argument wskaźnik do funkcji ;)

0

a nie lepiej po prostu przekazać obiekt funkcyjny. Czyli taki który zawiera tą metodę co chesz wywołać i normalnie go przesłać do funkcji jak to się zwykle robi z obiektami a nie jakoś dziwnie cudować ze wskaźnikami do funkcji:

class B {
public:
    void fun(void) {}
};
class A {
  public:
  void fun(B & obj) {
      obj.fun();
  }
};

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