Variadic Function ohne Parameteranzahl



  • Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃



  • Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?



  • Shade Of Mine schrieb:

    Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?

    Einen Fehler. Er will sich selbst keine Fehler antun.



  • Shade Of Mine schrieb:

    Wurstinator schrieb:

    Vektor<5, double> i<3>(array);
    

    Das will ich dem Nutzer (was eigentlich nur ich sein werde) nicht antun 😃

    Was soll das darstellen?

    Den Konstruktor?!
    Ich hab es nur kurz gegooglet und nicht ausprobiert; wenn es falsch ist, hättest du mir ja einfach die richtige Variante sagen können.



  • Wurstinator schrieb:

    wenn es falsch ist, hättest du mir ja einfach die richtige Variante sagen können.

    Also ich könnte es nicht. Ich kann zwar Template-Konstruktoren definieren, aber ich weiß nicht, wie man sie explizit aufruft. Geht das überhaupt?

    #include <iostream>
    
    struct Foo{
        template<typename T>
        Foo(T t){
            std::cout<<sizeof(T)<<' '<<t<<'\n';
        }
    };
    
    int main()
    {
        Foo f1('a');
        Foo f2(3.14);
        <short>Foo f3(5);//??
        Foo<short> f3(5);//??
        Foo f3<short>(5);//??
        Foo f3(5)<short>;//??
    }
    


  • volkard schrieb:

    Geht das überhaupt?

    Nein, bei Template-Konstruktoren müssen die Templateparameter aus den Funktionsargumenten hergeleitet werden können.



  • Achso, der Compiler schließt also automatisch auf die Größe des Arrays? Das ist ja nett 🙂

    Und was war jetzt hiermit:

    non-POD + ellipse ist sowieso UB.

    Wieso sorgt das für "UB"?



  • Wurstinator schrieb:

    Wieso sorgt das für "UB"?

    Weil die variable Argumentliste ein C-Sprachmittel ist, das nicht auf die Kopiersemantik von Klassen ausgelegt worden ist. Kopierkonstruktor etc. werden also nicht aufgerufen. Ähnlich wie wenn du versuchst, Klassen mit memcpy() zu kopieren.



  • Hm, okay.
    Aber ich hab die Methoden ja jetzt so geändert, dass die Elemente mit dem Zuweisungsoperator in den Array eingefügt werden. Somit sollte das doch fehlerfrei gehen, oder nicht?



  • Hi,
    kann mir jemand erklären, was dieser Teil aus der "fertigen" Vektor-Klasse macht ?

    template<unsigned int DIM, class VTYPE>
    template<class any>
    Vektor<DIM, VTYPE>::Vektor(any* x, ...)
    {
        va_list args;
        va_start(args, x);
        for (unsigned int n = 0; n < DIM; n++)
            values[n] = va_arg(args, VTYPE);
        va_end(args);
    }
    

    Gruss



  • Was genau meinst du?
    Der Konstruktor nimmt eine beliebige Anzahl von Parametern und nimmt diese dann als Vektor-Werte.


Anmelden zum Antworten