В C++ я впервые столкнулся с указателями на функции.
Я пытался использовать это, чтобы сделать его похожим на Action и Delegate в C#.
Однако при объявлении указателя на функцию необходимо указывать тип класс, в котором существует функция.
ex) void (A :: * F) ();
Могу ли я использовать указатель функции, который может хранить функцию-член любого класса?
Как правило, указатели на функции используются, как показано в приведенном ниже коде.
class A {
public:
void AF() { cout << "A::F" << endl; }
};
class B {
public:
void(A::*BF)();
};
int main()
{
A a;
B b;
b.BF = &A::AF;
(a.*b.BF)();
return 0;
}
Я хочу использовать его, как код ниже.
возможно ли это?
Или есть что-то еще, чтобы заменить указатель функции?
class A {
public:
void AF() { cout << "A::F" << endl; }
};
class B {
public:
void(* BF)();
};
int main()
{
A a;
B b;
b.BF = a.AF;
return 0;
}
Я решил вопрос через ответ.
Спасибо!
#include <functional>
#include <iostream>
class A {
public:
void AF() { std::cout << "A::F" << std::endl; }
};
class C {
public:
void CF() { std::cout << "C::F" << std::endl; }
};
class B {
public:
B(){}
std::function<void()> BF;
};
int main() {
A a;
C c;
B b;
b.BF = std::bind(&A::AF, &a);
b.BF();
b.BF = std::bind(&C::CF, &c);
b.BF();
int i;
std::cin >> i;
return 0;
}
AF
статическим методом или глобальной функцией? В любом случае вам не нужно обращаться ни к одному члену классаA
. - person user202729   schedule 01.06.2019auto
не является типом. Это просто ключевое слово, сообщающее компилятору, что при инициализации переменной необходимо вывести правильный тип. Переменная по-прежнему имеет статический тип, и этот тип не может измениться. Например;int i = 42;
иauto i = 42;
дают точно одинаковые результаты. В обоих случаях типi
равенint
, и он остаетсяint
навсегда. - person Jesper Juhl   schedule 01.06.2019std::function
для указателей на функции-члены. Тип шаблона не требует класса. - person Weak to Enuma Elish   schedule 01.06.2019