Ich habeWie kann ich instanziiert Klasse mit Funktionszeiger als Vorlage arg
template <void (*T)(Entity *), typename Caller>
class Updater
{
public:
Updater(Caller c):m_caller(c){}
void process(Entity * e)
{
(m_caller->*T)(e); //Is this right?
}
private:
Caller m_caller;
};
Ich verstehe ich es wie
Foo f;
Updater<&Foo::Bar> updater(&f);
instanziiert kann unter der Annahme, dass Foo
hat
void Foo::Bar(Entity *e);
aber Was ist, wenn es die gewünschte Methode tempiert hat? So,
template <typename T>
void Bar(T t);
Wie sollte ich es installieren? So was:?
Foo f;
Updater<&Foo::Bar<Entity *>> updater(&f);
Wenn ich das tue in meinem echten Code, ich
bekommeninvalid template argument for ..., expected compile-time constant expression
So 2 Fragen:
1 ist (m_caller->*T)(e);
richtig? Wenn nicht, wie rufe ich es an?
2, wie kann ich es instanziieren?
Sind Sie sicher, Sie haben keinen Platz zwischen den> 's in Updater <& Foo :: Bar> Updater (&f);? –
Steed
@Steed es heißt "rechtwinklige Klammern" und es ist völlig in Ordnung in C++ 11, siehe http: // www2.research.att.c om/~ bs/C++ 0xFAQ.html # Klammern – relaxxx
Ich glaube nicht, "Updater " ist korrekt, und Foo :: Bar ist ein Zeiger auf Member-Funktion, aber Ihre Vorlage Parameter ist ein Zeiger auf Funktion, sie sind nicht der gleiche Typ. – Cosyn