Ich schreibe einen Spielecode mit C++. Ich möchte die Memberfunktion Child
in einen Delegaten binden.Mitglied Functor der Inherited Class
Ich möchte init_and_bind
Funktion wie dieser vereinfachten Code verwenden:
class Parent {
protected:
Widget* widget;
};
class Child : public Parent {
public:
void foo() {
widget->init_and_bind(this, &Child::bar);
}
void bar() { /* do something */ }
};
Ich möchte init_and_bind
in Widget
Klasse implementieren, so implementiert I wie unten Code:
// pre-defined in engine
void Delegate::bind(Parent* object, void(Parent::* function)());
void Widget::init_and_bind(Parent* object, void(Parent::* function)()) {
init();
delegate->bind(object, function);
}
Aber es funktioniert nicht Arbeit. Weil der zweite Parameter von init_and_bind
nur den Member-Funktortyp von Parent akzeptiert. Also kann ich nicht Mitglied Funktor von Child übergeben. Also habe ich versucht Vorlage zu verwenden und reinterpret_cast
:
template<typename T>
void Widget::init_and_bind(Parent* object, void(T::* function)()) {
init();
delegate->bind(object, function); // error
delegate->bind(object, reinterpret_cast<void(Parent::*)()>(function); // error
}
Aber es ist auch nicht funktionieren. Weil es nicht gelungen ist, den Funktor Child
auf Parent
's Funktor zu werfen.
Also, welcher Typ sollte init_and_bind
's zweites Argument sein?
'static_cast', nicht' reininterpret_cast'. – StoryTeller
@StoryTeller Oh es funktioniert, danke! Aber ich weiß nicht, warum 'reiniterpret_cast' nicht kompiliert wird. –
Verschiedene Formen für verschiedene Jobs. Der Compiler prüft, ob Sie das für das Richtige verwenden. Beginnen Sie immer mit einem 'static_cast', wenn Sie überhaupt casten müssen. – StoryTeller