2017-01-29 3 views
0

Ich brauche einen Konstruktor für meine Klasse zu erstellen, die ein Objekt der gleichen Klasse von Typ als Argument T1 und erstellen ein Objekt vom Typ T. Der Compiler ist derjenige, der entscheidet, ob die Konvertierung T1 -> T durchgeführt werden kann.Konstruktor, der ein Objekt vom Typ <T> von einem Objekt des Typs erzeugt <T1>

Eg .: Wenn ich

haben
Object<int> o; 
Object<double> o1(o); 

Dies sollte funktionieren, da es nicht Präzision verliert. Es sollte nicht anders herum funktionieren (doppelte Werte in einem Integer-Objekt kopieren). Kann mir bitte jemand helfen/mir sagen, wie man das macht?

+0

Was ist Ihr tatsächliches Problem? richtig entscheiden, ob Präzision verloren geht? Wie definiert man die Genauigkeit für nicht-integrale Typen? –

+0

Wirklich solche Fälle wie die Umwandlung von Gleitkomma in Integral sollten nicht von Ihrer Klasse, sondern vom Benutzer gehandhabt werden. Es ist erlaubt, wenn Sie es jemals tun wollen. – DeiDei

+0

Mein generelles Problem ist: ich bin eine 2d-array-Klasse implementieren es hat den Index, in dem das vale gespeichert ist (int row int col) und ein Template-Wert (der tatsächliche Wert, den ich zum Array hinzufügen). Ich muss ein Array vom Typ T aus einem bestehenden Array von Typ U erstellen. Der Text für dieses Problem lautet: Delegieren Sie den Compiler die Casting-Kontrolle (U -> T) – user7337963

Antwort

4

Wie wäre es mit einem Vorlagenkopierkonstruktor?

template<typename T> 
class Object 
{ 
    template<typename U> 
    Object(const Object<U>& rhs) 
     : val(rhs.val()) // initialize appropirate members 
    { 
     // here you can assert what types U can be 
     static_assert(!(std::is_integral<T>::value && 
         std::is_floating_point<U>::value), 
        "Can't construct Object<Integral> with Object<FloatingPoint>"); 
    } 
}; 
+0

Vielen Dank für die Antwort, dachte ich zunächst so etwas aber ich kann es nicht zur Arbeit bringen. Meine Klasse basiert auf einer Template-Struktur (int i; int j; T val), und in meiner Klasse wird wie folgt deklariert: structName * arr; – user7337963

+0

Sie sollten alle relevanten Informationen in der Frage gepostet haben, damit sie berücksichtigt werden können. – DeiDei

+0

ja sorry dafür, mein schlechtes. – user7337963

Verwandte Themen