Variadic Function ohne Parameteranzahl



  • Und was ist ein "echter" Array?



  • Wurstinator schrieb:

    Und was ist ein "echter" Array?

    int EchtesArray[15];
    int* KeinEchtesArray = new int[15];
    int* AuchKeinEchtesArray = EchtesArray;
    


  • Du hast ein "echtes" Array dort in der Hand, wo du es als Array definiert hast. Dazu gehört z.B. der Klassenmember VTYPE values[DIM]; . Dort weiß der Compiler noch, daß er ein Array hat (und wie groß es ist), also kann er auch damit umgehen.


  • Mod

    unechte Zeiger? ganz ganz echte Arrays?

    Es ist viel einfacher:

    Zeiger, Arrays, Zeiger, Arrays... bitte nicht mit irgendwelchen Qualifikationen verwirren, die hier keinen Platz haben. Der Compiler macht ganz sicher nicht so feine Unterschiede.



  • camper schrieb:

    unechte Zeiger? ganz ganz echte Arrays?

    Es ist viel einfacher:

    Zeiger, Arrays, Zeiger, Arrays... bitte nicht mit irgendwelchen Qualifikationen verwirren, die hier keinen Platz haben. Der Compiler macht ganz sicher nicht so feine Unterschiede.

    Nur weil DU noch nie von echten und unechten Arrays gehört hast, heißt das noch lange nicht, dass es sie nicht gibt!



  • Also ein echter Array ist ein solcher, bei dem der Compiler die Größe kennt?

    void funktion(int array[]); // ein Zeiger
    void funktion(int array[3]); // ein Array?
    


  • Wurstinator schrieb:

    Also ein echter Array ist ein solcher, bei dem der Compiler die Größe kennt?

    Ja

    void funktion(int array[]); // ein Zeiger
    void funktion(int array[3]); // ein Array?
    

    Nein - das gehört zu den Erbschaften von C, daß hier die Größenangabe nicht beachtet wird und biede Funktionen einen Zeiger übergeben bekommen.



  • Manchmal mag man die Erbschaft so umgehen:

    template<unsigned int DIM, class VTYPE>
    Vektor<DIM, VTYPE>::Vektor(VTYPE (&vals)[DIM])//nur aufrufbar, wenn die Größe stimmt
    {
        memcpy(values, vals, sizeof(vals));//dann klappt's auch mit dem sizeof
    }
    


  • Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡



  • Nexus schrieb:

    Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡

    Erbschaft umgehen? Du solltest Dir eine andere Programmiersprache suchen!



  • Olga schrieb:

    Nexus schrieb:

    Oder man umgeht sie einfach, indem man keine Arrays benutzt. 💡

    Erbschaft umgehen? Du solltest Dir eine andere Programmiersprache suchen!

    Es gibt auch eine C++-Schule, die anfängt mit
    std::string filename("autoexec.bat");
    und nullterminierte char-arrays außerhalb string-Initialisierungen leugnet.
    Ich bin kein Freund davon. Aber es klappt. Und ist auch in vielerlei Hinsicht schneller, als zu fast allen Sprachen zu wechseln, die Strings als Sprachbestandteil haben.



  • Gewisse C-spezifische Dinge bringts schon. Zeiger und Makros zum Beispiel (ja, Makros). Aber bei Arrays, wo wir mit std::array die gleiche Funktionalität viel besser verpackt haben (Wertsemantik, keine implizite Zeiger-Konvertierung, STL-Interface, Assertions für Indexzugriff), sehe ich keinen Grund, an Antikem festzuhalten.



  • Und wie soll ich einen std::tr1::array als Parameter übergeben, wenn die Arraygröße variabel sein soll?



  • Wurstinator schrieb:

    Und wie soll ich einen std::tr1::array als Parameter übergeben, wenn die Arraygröße variabel sein soll?

    Mach die Funktion halt eben zu einer Template-Funktion.



  • 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.


Anmelden zum Antworten