Ich habe einen Code, der 100% für den Anwendungsfall funktioniert, den ich habe. Ich frage mich nur, ob jemand erklären kann, wie und warum es funktioniert.Übergabe eines Zeigers an eine Elementfunktion als Vorlageargument. Warum funktioniert das?
Ich habe eine Vorlage-Klasse, die zwischen einigen Code, der Threading und Netzwerkkommunikation behandelt und der Bibliotheksbenutzer zum Übergeben von Daten vom Server an den Benutzer übergeben.
template <class Bar,
class Baz,
class BazReturnType,
void (Bar::*BarSetterFunction)(const BazReturnType &),
BazReturnType (Baz::*BazGetterFunction)(void) const>
class Foo
{
Foo(Bar *bar)
: m_bar(bar)
{
}
void FooMemberFunction(const Baz *baz)
{
boost::bind(BarSetterFunction, m_bar,
boost::bind(BazGetterFunction, baz)())();
}
Bar *m_bar;
};
Diese Vorlage wird instanziiert und in der Bibliothek in Abhängigkeit von der Art der Bar und Baz wie so verwendet:
typedef Foo<MyBar,
MyBaz,
ReturnTypeFromBazGetterFunction,
&MyBar::ActualSetterFunction,
&MyBaz::ActualGetterFunction >
MyFoo;
MyBar *bar = new MyBar;
MyBaz *baz = new MyBaz;
MyFoo *f = new MyFoo(bar);
f->FooMemberFunction(baz);
Das alles funktioniert und boost :: bind die Getter/Setter-Funktionen aufruft passieren die Daten dort, wo es hingehört. Wie und warum funktioniert das Übergeben von Zeigern an Member als Template-Argument, wie in diesem Fall?
In Reaktion auf die Kommentare, hatte erkannt, ich nicht, dass Zeiger auf Elementfunktionen gültige Vorlage Argumente waren. Es ist nicht etwas, das ich zuvor "in der Wildnis" gesehen habe. Ich habe es versucht und es hat funktioniert, aber ich habe es nicht erwartet.
Ich bin mir nicht sicher, ob ich genau verstehe, was Sie fragen. Ein Zeiger auf Element ist einer der zulässigen Typen von Nicht-Typ-Vorlagenparametern. Suchen Sie im Standard nach einer Referenz? 14.1/4 [templ.param] –