2016-03-27 8 views
4

Ich versuche, eine API um die folgende Klassenvorlage zu schreiben:wie dynamisch eine Template-Klasse Guss

template <class A, class B> 
class MyClass { 
    public: 
     A foo; 
     B bar; 
     MyClass(); 
     MyClass(A in1, B in2) { 
      foo = in1; bar = in2; 
     } 
     void operator = (MyClass<A, B> in) { 
      foo = in.foo; bar = in.bar; 
     } 
}; 

Als Teil dieser API, würde ich Implementierer wie dynamisch zwischen verschiedenen werfen zu können, Arten von MyClass. Um dies zu erreichen, habe ich die folgende Funktion geschrieben:

Dieser Code kompiliert ohne Fehler.


Meine Frage:
Unter der Annahme, dass sowohl C operator C (A) und D operator D (B) für jede gegebene Implementierung der obigen Funktion definiert sind, wird diese verrückten suchen Funktion ausreichend sein Implementierer zu ermöglichen, dynamisch gegossen zwischen verschiedenen Arten von MyClass, (via (MyClass<C, D>)MyClass<A, B>) oder habe ich es komplett verloren?



Beispielimplementierung:

/* 
    * --- INCLUDE ABOVE CLASS DEFINITION HERE --- 
*/ 

#include <iostream> 
#include <string> 

int main() { 
    MyClass<int, char> foo(42, 'q'); 
    MyClass<double, std::string> bar; 

    bar = (MyClass<double, std::string>) foo; 
} 
+0

können Sie ein minimales übersetzbares Testprogramm zur Verfügung stellen? Die Frage ist cool. – Chiel

+2

Bitte verwenden Sie den Ausdruck "dynamically cast" für die Operation "dynamic_cast", um Verwechslungen zu vermeiden. Es gibt nichts Dynamisches in dem, was Sie gezeigt haben. Ihre verrückte Funktion sieht nicht korrekt aus. Die Typumwandlung wird entweder durch die nichtstatische Elementfunktion 'Class :: operator TYPE()' (keine Argumente, kein expliziter Rückgabetyp - Konvertierung von Klasse in TYPE) oder durch einen Konstruktor mit einem Argument angegeben: Class :: Class (TYPE) (Konvertierung von Typ zu Klasse). –

+0

@ n.m. Entschuldigung, ich hatte nicht realisiert, dass Typecasting-Operatoren nicht als "dynamisch" gelten. Vielleicht sollte ich die Terminologie der Typumwandlung prüfen. –

Antwort

0

Antwort: Ja.

Aber Sie müssen alle Abarten bieten VON C Operator C (A) und D Operator D (B), und Sie benötigen eine Kopie Konstruktor wie folgt aus:

class MyClass 
{ 
public: 
    A foo; 
    B bar; 
    MyClass(MyClass &cpy)// copy constructor 
    { 
     foo = cpy.foo; 
     bar = cpy.bar; 
    } 
    MyClass(A in1, B in2) 
    { 
     foo = in1; bar = in2; 
    } 
}; 

Copy-Konstruktor wird benötigt, um zu arbeiten:

return out; 

in MyClass (A in1, B in2) Methode

+0

Nur um zu verdeutlichen: Mit "alle Varianten ..." meinst du, dass von 'MyClass ' in 'MyClass ', double operator double (int) 'und' string operator string (char) 'muss definiert werden, richtig? –