Wildcards in Templates
-
Hallo,
ich bin relativ neu in C++ und würde gerne etwas wie
void foo(Bar<?> bar){}verwiklichen.
Mir ist klar, dass es etwas analoges in C++ nicht gibt.
Wie würdet ihr so einen Funktionsaufruf in C++ verwirklichen?
Gruß,
Wildcard
-
template <typename T> void foo(Bar<T>& bar) { }Wobei ich eigentlich soweit gehen würde einfach
template <typename T> void foo(T& bar) { }zu machen. Dann funktioniert dein foo() nicht nur mit jedem beliebigen Bar sondern überhaupt mit jedem beliebigem Typ der ein entsprechendes Interface bietet. Anmerkung: Wir reden hier nicht von Interface im Sinne des Java Schlüsselwortes sondern generell einfach von der Gesamtheit aller Ausdrücke die der Typ unterstützt. Beispiel:
template <typename T> void foo(T& bar) { bar(10); }Diese Funktion kannst du nun für jedes beliebige T verwenden das wie eine Funktion aufgerufen werden kann (das den Ausdruck bar(10) unterstützt). Es kann sich dabei natürlich um eine Funktion aber z.B. auch um eine Klasse handeln die einen entsprechenden operator() bietet.
-
Danke für deine Antwort.
Die Version klappt solange die Funktion nicht virtuell ist.
Was würdet ihr machen, wenn sie virtuell ist?Dann geht es ja leider so nicht mehr

-
Ich denke, das geht nicht.
14.5.2.3 schrieb:
A member function template shall not be virtual.
template <class T> struct AA { template <class C> virtual void g(C); // error virtual void f(); // OK };
-
Wildcard... schrieb:
Die Version klappt solange die Funktion nicht virtuell ist.
Was würdet ihr machen, wenn sie virtuell ist?Kommt drauf an. Man kann die Funktion zerlegen und darin virtuelle Funktionen aufrufen, also kann man zumindest den von T unabhänigen Teil virtuell gestalten.
Was willst du erreichen? Es gibt bestimmt ne Lösung. Nur sieht die vermutlich nicht so aus wie in Java, auch nicht so ähnlich. Java-Denken in C++ ist ein schlechter Ansatz, er schränkt dich nur ein
