Gelernt aus Fehlern



  • Artchi schrieb:

    Noch mal zu dem heise-Artikel: ich muß sagen, das es gut ist, das es wenigstens einen deutschen Artikel gibt. Es wäre schön, wenn da mehr kommen würde.

    Sehe ich sehr ähnlich. Habe das Thema auch deshalb hier eingestellt, um eine rege Diskussion anzuregen und daraus noch mehr zu erfahren. Denn ich bin selbst nicht tief in der Materie C++11.



  • Weiß wer eigentlich, wann (und ob) es möglich sein wird, einen string als template parameter zu übergeben?
    z.B.

    template< class ...char >
    class t_parser
    {
    };
    
    t_parser< "5+3*7" > p;
    

    Da es das ja noch nicht mit c++11 gibt: gibts irgendeinen workaround, wie man einen string trotzdem mit templates auswerten kann?
    (ich meine nicht sowas wie t_parser<'5','+','3'>)



  • Der Threadtitel ist aber sehr suggestiv. Aus welchen Fehlern wurde denn gelernt, von auto_ptr mal abgesehen?


  • Mod

    GorbGorb schrieb:

    Weiß wer eigentlich, wann (und ob) es möglich sein wird, einen string als template parameter zu übergeben?
    z.B.

    template< class ...char >
    class t_parser
    {
    };
    
    t_parser< "5+3*7" > p;
    

    Da es das ja noch nicht mit c++11 gibt: gibts irgendeinen workaround, wie man einen string trotzdem mit templates auswerten kann?
    (ich meine nicht sowas wie t_parser<'5','+','3'>)

    Das wird nicht möglich sein. Allerdings gibt es selbstdefinierte Literale, die man für diesen Zweck benutzen kann.

    template <char... c> struct expression {};
    template <char... c> constexpr expression<c...> operator "" _exp() { return expression<c...>(); }
    
    template <typename T> class t_parser {};
    
    t_parser< decltype("5+3*7"_exp) > p;
    

    Falls dein Compiler constexpr ausreichend unterstützt (also z.B. gcc-4.6+) und deine Strings als benannte Konstanten vorliegen, gibt es auch Möglichkeiten, die Zeichen dieses Strings als Templateparameter zu verwenden, hier habe ich das schon mal gemacht.



  • knivil schrieb:

    Der Threadtitel ist aber sehr suggestiv. Aus welchen Fehlern wurde denn gelernt, von auto_ptr mal abgesehen?

    auto_ptr ist eine Sache, aber hauptsächlich export. Steht aber auch im Artikel.

    Daraus hat man gelernt, die Concepts erstmal nicht mit rein zu nehmen und die Threading-Geschichte ist noch nicht komplett. Weiterhin werden Libs erstmal in den Technical Reports ausprobiert. Der TR2 ist ja schon angefangen: Boost Filesystem ist drin. Weitere Libs werden folgen, wahrscheinlich Boost Asio.



  • camper schrieb:

    Allerdings gibt es selbstdefinierte Literale, die man für diesen Zweck benutzen kann.

    Bist du dir sicher, dass das auch mit string literals funktioniert (d.h. nicht nur mit integral literals)? Der wikipedia Artikel scheint mir da anderes zu sagen (obwohl ich eigentlich eher geneigt bin dir zu glauben als einem wikipedia Artikel wenns um c++ geht).
    http://en.wikipedia.org/wiki/C%2B%2B11#User-defined_literals


  • Mod

    GorbGorb schrieb:

    camper schrieb:

    Allerdings gibt es selbstdefinierte Literale, die man für diesen Zweck benutzen kann.

    Bist du dir sicher, dass das auch mit string literals funktioniert (d.h. nicht nur mit integral literals)? Der wikipedia Artikel scheint mir da anderes zu sagen (obwohl ich eigentlich eher geneigt bin dir zu glauben als einem wikipedia Artikel wenns um c++ geht).
    http://en.wikipedia.org/wiki/C%2B%2B11#User-defined_literals

    Da hast du recht. Dann ist das doch nicht so möglich.



  • knivil schrieb:

    Der Threadtitel ist aber sehr suggestiv. Aus welchen Fehlern wurde denn gelernt, von auto_ptr mal abgesehen?

    Vielleicht mal den Artikel lesen, bevor du rumlaberst?



  • camper, hattest du da nicht ien constexpr char[] bei deinem Brainfukc Compiler, dass du irgendwie in dein Template bekommen hast?



  • Doch, hat er ja auch verlinkt. Ich hab zu dem Thema noch nen netten blog Eintrag gefunden:
    http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/
    Wird Zeit dass ich mir mal nen neuen gcc runterlad...



  • Im Artikel steht das hier zum shared_ptr:

    Aber auch ohne explizite Angabe des Deleter-Arguments zeigt sich ein positiver Effekt: Es lässt sich eine Klasse ohne virtuellen Destruktor problemlos durch einen shared_ptr der Basisklasse zerstören

    Wie geht das?


  • Mod

    314159265358979 schrieb:

    camper, hattest du da nicht ien constexpr char[] bei deinem Brainfukc Compiler, dass du irgendwie in dein Template bekommen hast?

    Schon, das war allerdings kein Literal. Damit die Umwandlung nachträglich funktioniert, muss ein Objekt mit internal oder external linkage her.



  • Die neuen Features sind doch zum Großteil fürn Arsch oder nur Kleinigkeiten.
    Und der ganze Templatemist ist eher was für verträumte Theoretiker als für die Praxis.



  • Enttäuschter schrieb:

    Die neuen Features sind doch zum Großteil fürn Arsch oder nur Kleinigkeiten.
    Und der ganze Templatemist ist eher was für verträumte Theoretiker als für die Praxis.

    Wieso das denn? Sobald man alle zur compilezeit bekannten Parameter an das Template übergibt, werden spezialisierte Funktionen automatisch vom Compiler erzeugt. Das führt zu mehr Performance und leichter wartbarem Code. Wäre jetzt nur mal ein simples Beispiel aus der Praxis.

    template<int i>
    void f(int k) {
      STATIC_ASSERT(i < A);
      ASSERT(k < B);
      // ...
    }
    

    Allerdings muss hier parametrisiert werden, sonst schimpft der Compiler bei der Verwendung von *k* in bedingten Ausdrücken - wäre der einzige Schönheitsfehler. Lässt sich das vielleicht eleganter beheben?



  • blöde Frage schrieb:

    Im Artikel steht das hier zum shared_ptr:

    Aber auch ohne explizite Angabe des Deleter-Arguments zeigt sich ein positiver Effekt: Es lässt sich eine Klasse ohne virtuellen Destruktor problemlos durch einen shared_ptr der Basisklasse zerstören

    Wie geht das?

    http://stackoverflow.com/questions/3899790/shared-ptr-magic/3900082



  • Ah, cool. Danke. 🙂


Anmelden zum Antworten