2016-04-02 2 views
1

Ich habe eine Vorlagenklasse mit vielen Elementvariablen. Eine kleine Anzahl dieser Variablen hat den Schablonentyp der Klasse, die meisten haben feste Typen.Nur nicht-triviale Kopiervorgänge definieren

Ich möchte zwischen einer Instanz der Klasse zu einer anderen mit Konvertierungen kopieren, kann dies aber nicht mit impliziter Kopie tun, wenn die Klassen nicht den gleichen Typ haben. Daher brauche ich eine Zuweisungsmethode.

Allerdings ist es bedauerlich, alle diese vielen Kopiervorgänge ausschreiben zu müssen, nur um die gewünschte Konvertierung durchzuführen.

Gibt es also eine Möglichkeit, den Zuweisungsoperator so einzurichten, dass implizite Kopien nach Möglichkeit erstellt werden?

Ein Beispiel Code folgt:

#include <iostream> 

template<class T> 
class MyClass { 
public: 
    int a,b,c,d,f; //Many, many variables 

    T uhoh;  //A single, templated variable 

    template<class U> 
    MyClass<T>& operator=(const MyClass<U>& o){ 
    a = o.a; //Many, many copy operations which 
    b = o.b; //could otherwise be done implicitly 
    c = o.c; 
    d = o.d; 
    f = o.f; 
    uhoh = (T)o.uhoh; //A single converting copy 
    return *this; 
    } 
}; 

int main(){ 
    MyClass<int> a,b; 
    MyClass<float> c; 
    a.uhoh = 3; 
    b  = a; //This could be done implicitly 
    std::cout<<b.uhoh<<std::endl; 
    c = a;  //This cannot be done implicitly 
    std::cout<<c.uhoh<<std::endl; 
} 

Antwort

1

Es gibt 2 naive Weise:

  • Erstellen Sie eine Funktion Copyfrom (const MyClass & o), die die kopierbaren Werte kopieren dann rufen Sie es aus der Operator = Überladung plus eventuell Template-Spezialisierung je nach Ihren Bedürfnissen.
  • Packen Sie alle kopierbaren Werte in eine Unterklasse/struct, Sie können den Standardoperator = verwenden, der von Ihrem Compiler generiert wurde;)