Warum hat C++ so eine aufwendige Syntax?



  • Undertaker schrieb:

    KasF schrieb:

    Undertaker schrieb:

    soll das ein witz sein? nochmal zur erinnerung:

    static const bool isTrue = (T < N) ? (!(N % T) ? isVol<N,T+1,S+T>::value : isVol<N,T+1,S>::value) : false;
    

    😮

    Kannst du Lesen !?

    KasF schrieb:

    Muss auch natürlich zu meiner Verteidigung sagen, dass ich mit TMP am rumspielen gewesen bin und anstatt sich mit Variablennamen rumzuschlagen kann man schnell und einfach Ein-Bustaben Variablen wählen

    das erklärt aber nicht, warum du diese verschachtelten conditionals und keine einrückung statt formatiertes if/else verwendest. damit machst du dir das rumspielen nur unnötig schwer...

    if/else kann man bei template meta programmierung gar nicht verwenden.



  • ............... schrieb:

    if/else kann man bei template meta programmierung gar nicht verwenden.

    das kann ich gar nicht glauben 😮



  • War das jetzt ernst gemeint?

    In dem code geht es ja um die deklaration eines static const bool, der ja von if und dergleichen garnicht beeinflusst wrdn kann



  • ..._____ schrieb:

    In dem code geht es ja um die deklaration eines static const bool, der ja von if und dergleichen garnicht beeinflusst wrdn kann

    ja, aber kann man das nicht anders schreiben? z.b. mit einem constructor für die struct, in dem man auch if/else verwenden kann?
    ich kann mir nicht vorstellen, dass es dafür keinen anderen weg gibt, als so einen frickel-code. wenn nicht, dann sind wir ja wieder voll beim thema 😉



  • En Konstruktor, der zur Compile Time ausgeführt wird? 😮



  • Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮



  • Undertaker schrieb:

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮

    Nein, du hast sie einfach noch nicht verstanden 😉
    Es musste halt schnell gehen, deswegen ist da ein Frickel-Code bei rausgekommen. So nun ist aber jud ...



  • Man beachte bitte auch, dass die Variable vom Typ bool ist..es ist also gar nicht möglich einen eigenen Konstruktor dafür zu schreiben 💡



  • lolz schrieb:

    Man beachte bitte auch, dass die Variable vom Typ bool ist..es ist also gar nicht möglich einen eigenen Konstruktor dafür zu schreiben 💡

    ich dachte man könnte mit einem konstruktor in der struct den 'bool' initialisieren. geht das nun, oder nicht?



  • Xin schrieb:

    Undertaker schrieb:

    Xin schrieb:

    ...aber grundsätzlich muss man C++ als eine der besten Sprachen auf dem Markt akzeptieren.

    weil sie weit verbreitet ist bzw. oft genutzt wird, oder wieso meinst du das?
    🙂

    Wenn Du Dir Stellenangebote ansiehst, so wird Java und C# werden inzwischen deutlich mehr genutzt als C++.

    Ich halte C++ für die leistungsfähigere Sprache, doch gefragt sind inzwischen Sprachen, die bei weniger Erfahrung und Qualifikation schneller Resultate liefern.

    Das kommt immer abwertend rueber, aber was ist daran schlecht?
    Wenn ich mit weniger Aufwand das selbe in kuerzerer Zeit liefere als ein C++-Hacker, ist das eher ein Vorteil. Die Programme die geschrieben werden, werden immer komplexer, da ist eine Abstraktion nicht wegzudenken. Ich halte es lieber mit Aufgabenteilung: Lass die Compiler-Hacker ihren Spass richtig gute Compiler zu bauen, die einen Code 1000 mal schneller machen koennen. Ich dagegen nehme mir den Spass anwendungsfreundliche Programme schreiben zu koennen, ohne die Zeit an Optimierungen zu verschwenden.

    Es werden auch immer weniger Asm-Hacker gesucht...



  • Undertaker schrieb:

    geht das nun, oder nicht?

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮



  • Dennis123 schrieb:

    Also meiner bescheidenen Meinung nach ist das sauber und effizient formatiert.
    Alles andere wäre nur eine unnötige verschwendung von Platz etc.

    Wie kann man etwas verschwenden, von dem man unendlich viel hat? :p



  • Undertaker schrieb:

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮

    Nein, du hast sie gar nicht erst verstanden 🤡



  • blablablabla schrieb:

    Undertaker schrieb:

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮

    Nein, du hast sie gar nicht erst verstanden 🤡

    was fehlt mir zum verständnis? warum gibt es keine compile-time constructors in C++?
    es gibt klassen-templates. haben die keine konstruktoren?



  • Undertaker schrieb:

    blablablabla schrieb:

    Undertaker schrieb:

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮

    Nein, du hast sie gar nicht erst verstanden 🤡

    was fehlt mir zum verständnis? warum gibt es keine compile-time constructors in C++?
    es gibt klassen-templates. haben die keine konstruktoren?

    Doch, haben sie, die werden aber wie alle Konstruktoren zur Laufzeit ausgeführt.



  • Mr. N schrieb:

    Undertaker schrieb:

    blablablabla schrieb:

    Undertaker schrieb:

    Michael E. schrieb:

    En Konstruktor, der zur Compile Time ausgeführt wird? 😮

    das geht nicht?
    habe ich tatsächlich die mächtigkeit der C++ templates so masslos überschätzt? 😮

    Nein, du hast sie gar nicht erst verstanden 🤡

    was fehlt mir zum verständnis? warum gibt es keine compile-time constructors in C++?
    es gibt klassen-templates. haben die keine konstruktoren?

    Doch, haben sie, die werden aber wie alle Konstruktoren zur Laufzeit ausgeführt.

    also mal angenommen ich habe sowas

    template <typename T>
    struct A
    {
        T i;
    
        A(T x)
        {
            i = x * x;
        }
    
        T get (void)
        {
            return i;
        }
    };
    

    und rufe es so auf:

    int x = A<int>(3).get();
    

    dann ist es doch das gleiche, als wenn ich schreiben würde

    int x = 9;
    

    weil der compiler ja den template-code selber ausrechnet. es steht ja alles schon zur compile-time fest. es sollte doch kein funktionsaufruf o.ä. erzeugt werden.
    oder nicht?



  • Das ist ein typsicher Fall für den Optimierer, aber hat nichts mit Templates zu tun. In C wird hier auch nicht - obwohl alles bekannt ist - direkt ein Ergebnis hingeschrieben (klar, macht dann der Optimierer...):

    int add (int i1, int i2) { return i1 + i2; }
    
    ...
    
    int j = add (5,7); // ist genauso j = 12
    

    Aber keine Sorge, darum kümmert sich dann der Compiler. Mit der Meta-Programmierung ist es in C++ aber im Gegensatz zu C tatsächlich möglich hier auch zur Compile-Time das Ergebnis zu berechnen!

    MfG SideWinder



  • Undertaker schrieb:

    es gibt klassen-templates. haben die keine konstruktoren?

    Nein. Was sollte der konstruieren? Ein Klassentemplate erzeugt Klassen, keine Objekte. Andererseits ist der Gedanke ja nicht ganz unsinnig: wenn es nur darum geht, Ausdrücke, deren Wert bereits während des Compilierens feststeht, zu verwenden, so ist die Benutzung von Templates (um den Compiler zu zwingen, die Berechnung gleich durchzuführen) eigentlich mit Kanonen auf Spatzen geschossen. Einerseits ist die Templatesyntax ziemlich barock und mit einigen Stolperfallen versehen, anderseits ist es im Wesentlich nur für integrale Typen möglich. Nicht ganz zufällig wird es C++0x nutzerdefinierte Literale und Erweiterung hinsichtlich konstanter Ausdrücke (Schlüsselwort constexpr) geben.



  • Undertaker schrieb:

    also mal angenommen ich habe sowas

    template <typename T>
    struct A
    {
        T i;
        
        A(T x)
        {
            i = x * x;
        }
        
        T get (void)
        {
            return i;
        }
    };
    

    und rufe es so auf:

    int x = A<int>(3).get();
    

    dann ist es doch das gleiche, als wenn ich schreiben würde

    int x = 9;
    

    weil der compiler ja den template-code selber ausrechnet. es steht ja alles schon zur compile-time fest. es sollte doch kein funktionsaufruf o.ä. erzeugt werden.
    oder nicht?

    Schau dir mal diesen Code an:

    struct A_int {
        int i;
    
        A(int x)
        {
            i = x * x;
        }
    
        int get()
        {
            return i;
        }
    };
    
    int x = A_int(3).get();
    

    Der Code ist mit deinem vergleichbar. Der Compiler kann in beiden Fällen

    int x = 9;
    

    draus machen. Metaprogrammierung wäre was anderes:

    template<int x>
    struct A {
      static const int get = x * x;
    };
    int x = A<3>::get;
    

    Hier ist garantiert, dass der Compiler die Berechnung zur Compile-Zeit ausführt.



  • Shade Of Mine schrieb:

    ...
    von value typen erbt man nunmal nicht. ...
    ...hätte sie final/sealed zu sein. da man eben von ihr nicht erben soll. ergo verstehe ich das ganze nicht.

    "Du sollst nicht von int erben !" ? Elftes Gebot ?

    Also diese moralischen Grenzen kann ich in dem Zusammenhang nicht recht akzeptieren. Es wäre schön, etwas zu haben, was den Intellekt anspricht.
    😃

    Gruß,

    Simon2.

    P.S.: In meinem Beispiel hieße das dann "Man soll eben nicht dieselbe Weltformel für Zwerpinscher wie für alle anderen haben !"


Anmelden zum Antworten