Warum hat C++ so eine aufwendige Syntax?



  • Undertaker schrieb:

    Michael E. schrieb:

    Undertaker schrieb:

    ...und ich dachte, templates wären eine tolle sache 🙄
    jetzt bin ich aber echt enttäuscht 😞

    Ach, weil du keine Ahnung hast, bist du enttäuscht? Nicht wissen, was TMP ist, aber dann mal drüber ablästern...

    klar bin ich enttäuscht, wenn's noch nicht mal bei so einfachen sachen wie x*x funktioniert. stattdessen muss man mit komischen structs mit 'static const' membern rumfrickeln und kann noch nicht mal normale kontrollstrukturen wie if/else einsetzen?

    Wieso ist ein Konstrukt schlechter, weil dus komisch findest? Nur mal ein klitzekleines Beispiel für TMP:

    template<
          typename Graph,
          typename First = typename boost::mpl::begin<Graph>::type,
          typename Last = typename boost::mpl::end<Graph>::type,
          typename Result = boost::mpl::map0<>
        >
        struct clean_graph {
          typedef typename boost::mpl::deref<First>::type::first key;
          typedef typename boost::mpl::if_<
              typename boost::mpl::has_key<
                Result,
                key
              >::type,
              Result,
              typename boost::mpl::insert<
                Result,
                boost::mpl::pair<
                  key,
                  typename boost::mpl::at<
                    Graph,
                    key
                  >::type
                >
              >::type
            >::type next;
          typedef typename clean_graph<
              Graph,
              typename boost::mpl::next<First>::type,
              Last,
              next
            >::type type;
        };
    
        template<typename Graph, typename First, typename Result>
        struct clean_graph<Graph, First, First, Result> {
          typedef Result type;
        };
    

    Diese Funktion löscht Duplikate aus einer Graphenliste. Wird benutzt um Toposort zur Compilezeit zu implementieren. Frag bitte nicht, wozu das gut sein soll, es hat seinen Zweck. Und vielleicht ließe sich das auch eleganter implementieren. Aber es funktioniert, so wie es ist.

    Kein Grund zur Trauer.



  • Mr. N schrieb:

    Wieso ist ein Konstrukt schlechter, weil dus komisch findest?

    es ist zumindest schlechter als ich dachte.
    sorry, ich bin nicht so der erfahrene C++ user und war bisher der meinung, dass mit templates (z.b. function templates) alles was möglich ist, zur compile-time berechnet wird. das scheint aber nicht der fall zu sein und wirkt auf mich deshalb ziemlich ernüchternd...
    🙂



  • Assembler funktioniert auch. Normales C++ is ja schon grausig, aber sowas is einfach nur noch :kotzsmilie:



  • Undertaker schrieb:

    Mr. N schrieb:

    Wieso ist ein Konstrukt schlechter, weil dus komisch findest?

    es ist zumindest schlechter als ich dachte.
    sorry, ich bin nicht so der erfahrene C++ user und war bisher der meinung, dass mit templates (z.b. function templates) alles was möglich ist, zur compile-time berechnet wird. das scheint aber nicht der fall zu sein und wirkt auf mich deshalb ziemlich ernüchternd...
    🙂

    Doch, es wird alles was möglich ist zur Compile-Zeit berechnet. Ein Funktionsaufruf gehört nicht dazu - wobei der oft vom Optimierer entfernt werden kann.

    Und nein, C++-Templates sind nicht das Non-Plus-Ultra. Aber sie sind besser als nichts und es wäre lächerlich, sich über ihre Präsenz zu beklagen.



  • Undertaker schrieb:

    Mr. N schrieb:

    Wieso ist ein Konstrukt schlechter, weil dus komisch findest?

    es ist zumindest schlechter als ich dachte.
    sorry, ich bin nicht so der erfahrene C++ user und war bisher der meinung, dass mit templates (z.b. function templates) alles was möglich ist, zur compile-time berechnet wird. das scheint aber nicht der fall zu sein und wirkt auf mich deshalb ziemlich ernüchternd...
    🙂

    Ich meine irgendwo gelesen zu haben das TMP Turing-Volllständig sei ...

    Zweck:

    • Undurchsichtige Konstanten vermeiden. Bei einem Quadrat mag es kein Problem sein die Konstante selber auszurechnen, bei einem Sinus wirds dann schon lustig wenn man was ändern will. da ist sin<1.2>::value einfach eine eindeutige Lösung (TMP mit Fließkommazahlen, war das vom std abgedeckt?)
    • Schreibarbeit abnehmen, z.B. beim unrolling von loops
    • to be continued


  • Undertaker schrieb:

    dsfsdf schrieb:

    int x = A<square<int>(3)>::get;
    

    error C2975: 'x' : invalid template argument for 'A', expected compile-time constant expression

    offenbar wird das function template nicht zur compile-time berechnet.
    ...und ich dachte, templates wären eine tolle sache 🙄
    jetzt bin ich aber echt enttäuscht 😞

    Gleich noch eine Enttäuschung für Dich: Sie können kein Brot toasten und das "Blei in Gold verwandeln" klappt bei denen auch nicht so recht. 😉

    templates (= "Schablonen") sind eben genau das: Schablonen für C++-Klassen oder -Funktionen. Dass sie zur Compilezeit ausgewertet werden, verschafft erhöhte Typsicherheit, ist aber nicht ihr Kernziel.

    Gruß,

    Simon2.



  • Mr. N schrieb:

    Und nein, C++-Templates sind nicht das Non-Plus-Ultra. Aber sie sind besser als nichts und es wäre lächerlich, sich über ihre Präsenz zu beklagen.

    ich beklage ja nicht die präsenz, sondern einfach nur dass sie nicht soviel können, wie ich erhofft hatte.
    wie Simon2 schon schrieb, sind templates nichts anderes als schablonen, mit denen man klassen und funktionen losgelöst von festen datentypen entwickeln kann. das ist wohl ihr einziger bestimmungszweck und diese basteleien mit TMP scheinen eine art abfallprodukt zu sein.
    naja, ich war noch nie der meinung, dass C++ besonders nützlich ist. was soll's also - es stört mich nicht wirklich...
    🙂



  • Mit Templates kann man noch viel mehr. Guck dir mal Loki und Boost an.



  • Michael E. schrieb:

    Mit Templates kann man noch viel mehr. Guck dir mal Loki und Boost an.

    Ehm, meinste das wird seine Meinung ändern? Das Posting hättest du dir ersparen können.
    Warum wollen ihm alle C++ und Templates erklären, wo er schon vor Monaten nichts dazu gelernt hat und es anscheinend auch nicht will.
    Fallt doch nicht immer wieder auf seine Verarschung rein.



  • Undertaker schrieb:

    naja, ich war noch nie der meinung, dass C++ besonders nützlich ist. was soll's also - es stört mich nicht wirklich...
    🙂

    Nützlich ist C++ wirklich nicht. Man kann nur solche Sachen machen, wie Betriebssysteme programmieren oder Office-Anwendungen wie z. B. Microsoft Office oder eine Java Virtual Machine oder ebedded Systeme oder Interpreter oder Compiler für Programmiersprachen oder Raketensteuerungen oder Waschmaschinen. Man kann Systemnah programmieren oder auch objektorientiert oder funktional 🤡 .

    Habe ich irgendetwas vergessen? Gibt es irgendetwas, was ich mit einem Rechner im weitesten Sinne machen kann und mit C++ nicht geht? Also da fällt mir nichts ein.

    Mit Templates kann man keine Funktionen aufrufen. Ich kenne auch keine Programmiersprache, mit der man in einer if-Abfrage Wiederholungen erreichen kann (also eine if-Schleife :p ). Templates sind einfach nicht dazu da.



  • Naja, wir sind halt alles nur Lemminge. Bjarne Stroustrup und Herb Sutter sind die Ober-Lemminge. 😃 🤡 Sind halt alles Menschen, die nutzloses Zeug verbreiten. Das ganze investierte Geld in C++-Projekte hätte man auch verbrennen können. Vista... äh, Undertaker hat uns die Augen geöffnet. 😃 👍



  • darthdespotism schrieb:

    Ich meine irgendwo gelesen zu haben das TMP Turing-Volllständig sei ...

    http://wwwcs.uni-paderborn.de/cs/ag-madh/WWW/Teaching/2004WS/Perlen/HILBIG.pdf



  • Undertaker was du willst hatte Volkards mal als Projekt gestart: eine neue Sprache die C++ als Präprozessor hat, damit wäre all das was du willst (ein komplettes Programm während dem Compilieren auszuführen und dadurch Code zu erzeugen) möglich.



  • tntnet schrieb:

    Undertaker schrieb:

    naja, ich war noch nie der meinung, dass C++ besonders nützlich ist. was soll's also - es stört mich nicht wirklich...
    🙂

    Nützlich ist C++ wirklich nicht. Man kann nur solche Sachen machen, wie Betriebssysteme programmieren oder Office-Anwendungen wie z. B. Microsoft Office oder eine Java Virtual Machine oder ebedded Systeme oder Interpreter oder Compiler für Programmiersprachen oder Raketensteuerungen oder Waschmaschinen. Man kann Systemnah programmieren oder auch objektorientiert oder funktional 🤡 .

    ja, man kann
    aber mit anderen sprachen kann man auch - und meistens besser 😉

    Artchi schrieb:

    Naja, wir sind halt alles nur Lemminge. Bjarne Stroustrup und Herb Sutter sind die Ober-Lemminge. 😃 🤡 Sind halt alles Menschen, die nutzloses Zeug verbreiten.

    na, übertreib' mal nicht so.
    komplett sinnlos ist gar nichts und die leute haben ja auch ihren spass damit (den wir ihnen nicht nehmen wollen), das darfst du nicht vergessen.

    Artchi schrieb:

    Das ganze investierte Geld in C++-Projekte hätte man auch verbrennen können.

    hehe, es ist ja schon verbrannt 😃
    ich glaube, C++ projekte sind nie besonders wirtschaftlich.



  • Undertaker schrieb:

    offenbar wird das function template nicht zur compile-time berechnet.
    ...und ich dachte, templates wären eine tolle sache 🙄
    jetzt bin ich aber echt enttäuscht 😞

    Das ist ein grundlegendes Verständnis Problem.

    square ist eine normale Funktion. Vergessen wir die Templates mal.

    int square(int x) {
      return x*x;
    }
    

    Wenn wir nun

    int x=square(2);
    

    schreiben, dann kann der Compiler dies vermutlich auf ein

    int x=4;
    

    optimieren. aber zB in der Debug Version wird er diese Optimierung nicht durchführen. Und hier ist diese Optimierung garnicht erst möglich:

    int x=square(rand());
    

    wie wir sehen: magie gibt es keine.
    wenn wir nun templates hinzufügen: inwieweit ändern wir die funktion? GARNICHT.

    template<typename T>
    T square(T x) {
      return x*x;
    }
    

    es ist immer noch die selbe funktion. alles was mir gemacht haben ist uns schreibarbeit erspart. dieses template kann man auch ohne templates schreiben:
    naemlich als square für int, float, double,... im Prinzip unendlich viele Varianten. Da aber unendlich viele Funktionen schreiben recht langweilig ist und man damit auch nie fertig wird, erstellt man ein template.

    Wir haben hier noch nichts was zur compiletime ausgeführt wird. es ist immer noch die gute alte square Funktion. Der Compiler kann sie optimieren, muss aber nicht.

    Jetzt kommt die Magie der Templates:
    Das Template selber wird ausgewertet, ergo die unendlich vielen square funktionen werden beim kompilieren erstellt. Wir können dies nun nutzen um eine square funktion zu schreiben die statisch ausgewertet wird:

    template<int X>
    struct Square {
      static const int Value = X*X;
    };
    
    int x = Square<2>::Value;
    

    Aber man hat hier wieder einen Nachteil:

    int x=Square<rand()>::Value;
    

    funktioniert nicht.



  • Undertaker schrieb:

    tntnet schrieb:

    Undertaker schrieb:

    naja, ich war noch nie der meinung, dass C++ besonders nützlich ist. was soll's also - es stört mich nicht wirklich...
    🙂

    Nützlich ist C++ wirklich nicht. Man kann nur solche Sachen machen, wie Betriebssysteme programmieren oder Office-Anwendungen wie z. B. Microsoft Office oder eine Java Virtual Machine oder ebedded Systeme oder Interpreter oder Compiler für Programmiersprachen oder Raketensteuerungen oder Waschmaschinen. Man kann Systemnah programmieren oder auch objektorientiert oder funktional 🤡 .

    ja, man kann
    aber mit anderen sprachen kann man auch - und meistens besser 😉

    Warum bin ich (und nicht nur ich) regelmäßig blöd genug um so jemandem etwas erklären zu wollen? C++ nichtmal ansatzweise verstehen... aber scheiße finden kann mans ja. 👍



  • Undertaker schrieb:

    ...
    ja, man kann
    aber mit anderen sprachen kann man auch - und meistens besser 😉
    ...

    .. wie das reichhaltige Portfolio an Betriebssystemen, embedded systems, virtual machines, ...., die in Java, Smalltalk, Ruby, ... geschrieben wurden, beweist. 👍

    Schon lustig, dass die Vorteile, die anderen Sprachen erst mit C/C++ ermöglicht wurden, als Argument gegen C/C++ verwendet werden. 😃

    Gruß,

    Simon2.



  • Mr. N schrieb:

    Warum bin ich (und nicht nur ich) regelmäßig blöd genug um so jemandem etwas erklären zu wollen? C++ nichtmal ansatzweise verstehen... aber scheiße finden kann mans ja. 👍

    Für das Verhalten gibt's nur eine Erklärung: grenzenloser Optimismus 😃 (zumindest bei mir - da braucht's schon einiges, um jemanden aufzugeben)



  • CStoll schrieb:

    Für das Verhalten gibt's nur eine Erklärung: grenzenloser Optimismus 😃 (zumindest bei mir - da braucht's schon einiges, um jemanden aufzugeben)

    Langsam verliere ich für gewisse Leute aber langsam den Optimismus 😕 Aber mehr als versuchen kann man ja leider nicht.



  • Simon2 schrieb:

    Undertaker schrieb:

    ...
    ja, man kann
    aber mit anderen sprachen kann man auch - und meistens besser 😉
    ...

    .. wie das reichhaltige Portfolio an Betriebssystemen, embedded systems, virtual machines, ...., die in Java, Smalltalk, Ruby, ... geschrieben wurden, beweist. 👍

    Schon lustig, dass die Vorteile, die anderen Sprachen erst mit C/C++ ermöglicht wurden, als Argument gegen C/C++ verwendet werden. 😃

    Gruß,

    Simon2.

    Nenn mir mal einen Grund wieso man un Ruby kein Betriebsystem schreiben kann. Ruby, wie C++ und Java und Brainfuck sind Turing-Vollstaendige Sprachen. Man muss doch nur einen passenden Compiler schreiben...

    Aus Maschinenebene unterscheiden sich die Sprachen doch nicht. Die Sprachen unterscheiden sich nur fuer uns Menschen durch die Sprachkonstrukte, die es einem bequemer machen damit zu programmieren. Wenn wir schon Sprachen vergleichen, dann nur durch a) ist die Sprache Turing-Vollstaendig und b) wie bequem/nuetzlich sind die Sprachkontrukte. Leider ist b) subjektiv, so dass wir uns hier ewig streiten koennen.


Anmelden zum Antworten