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ę?
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);
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;
}
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.
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 ;)
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();
}
};