variadic template parameters: parameter-type zur laufzeit auswaehlen


  • Mod

    static void ((*const)throws())[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

    ➡

    using fun = void(*)();
       static const fun throws[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

  • Mod

    Arcoth schrieb:

    static void ((*const)throws())[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

    ➡

    using fun = void(*)();
       static const fun throws[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

    Einzeiler rulz

    void do_magic_and_throw(unsigned int idx) {
           (void(*[])()){ [] {}, [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... }[idx<=sizeof...(PARAMS)+1?idx:0]();
       }
    


  • camper schrieb:

    Einzeiler rulz

    (void(*[])()){ [] {}, [] {
    

    Mal ganz ernsthaft: ist sowas noch lesbar?

    Ich schreibe ja auch gern in Perl und es wurde der Sprache immer vorgeworfen, sie sei nicht lesbar wegen der Sonderzeichen. Aber das hier ist doch nicht besser: 17 Sonderzeichen hinter dem void! Ernsthaft? Gut, []{} ist z.B. schnell als leeres Lambda identifiziert, und nach längerem Hingucken verstehe ich sogar den ganzen Ausdruck. Geht das nicht in verständlicher?


  • Mod

    wob schrieb:

    camper schrieb:

    Einzeiler rulz

    (void(*[])()){ [] {}, [] {
    

    Mal ganz ernsthaft: ist sowas noch lesbar?

    Der ernsthafte Teil des Threads ist zu Ende, jetzt ist Feierabend. Ein Lisp-Programmierer dürfte sich wohlfühlen, und immerhin ist es nicht immer dieselbe Klammerart.


  • Mod

    camper schrieb:

    Arcoth schrieb:

    static void ((*const)throws())[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

    ➡

    using fun = void(*)();
       static const fun throws[] = { [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... };
    

    Einzeiler rulz

    void do_magic_and_throw(unsigned int idx) {
           (void(*[])()){ [] {}, [] { throw PARAM1{}; }, [] { throw PARAMS{}; }... }[idx<=sizeof...(PARAMS)+1?idx:0]();
       }
    

    Ist das überhaupt gültiges C++? IIRC ist T[] keine gültige type-id in einer functional cast expression.


  • Mod

    Arcoth schrieb:

    IIRC ist T[] keine gültige type-id in einer functional cast expression.

    In C++03 hättest du noch recht gehabt.

    Edit: Err. du hast recht, aber hier haben wir (T)x also Explicit type conversion (cast notation).


  • Mod

    camper schrieb:

    Arcoth schrieb:

    IIRC ist T[] keine gültige type-id in einer functional cast expression.

    In C++03 hättest du noch recht gehabt.

    Ich bin mir ziemlich sicher, dass ich immer noch Recht habe.


  • Mod

    korrigiert.


  • Mod

    camper schrieb:

    Edit: Err. du hast recht, aber hier haben wir (T)x also Explicit type conversion (cast notation).

    Genau genommen haben wir hier überhaupt nichts, weil das einfach kein gültiges Produkt der Grammatik ist.

    Edit: Also ich hätte nichts gegen compound literals in C++. Proposal? 🙂


  • Mod

    Arcoth schrieb:

    camper schrieb:

    Edit: Err. du hast recht, aber hier haben wir (T)x also Explicit type conversion (cast notation).

    Genau genommen haben wir hier überhaupt nichts, weil das einfach kein gültiges Produkt der Grammatik ist.

    Komisch, dass kein vernünftiger moderner Compiler damit Probleme hat. (Visual C++ zählt nicht). Diese Behauptung müsstest du also noch begründen.


  • Mod

    camper schrieb:

    Arcoth schrieb:

    camper schrieb:

    Edit: Err. du hast recht, aber hier haben wir (T)x also Explicit type conversion (cast notation).

    Genau genommen haben wir hier überhaupt nichts, weil das einfach kein gültiges Produkt der Grammatik ist.

    Komisch, dass kein vernünftiger moderner Compiler damit Probleme hat. (Visual C++ zählt nicht). Diese Behauptung müsstest du also noch begründen.

    Ist das dein Ernst? Schalte mal deine Warnungen an. GCC und Clang beschweren sich mit "ISO C++ forbids compound-literals", und die Grammatik von cast-expressions verlangt eindeutig nach einem Ausdruck nach dem eingeklammerten Typen. Du stimmst sicher zu, dass {...} kein Ausdruck ist.

    (Visual C++ zählt nicht).

    Visual C++ ist zumindest im Frontend auf EDG basiert, welches relativ akkurat sein dürfte (glaub ich). Kenne mich damit aber zu wenig aus.


  • Mod

    Ok. Schön. Aus irgendeinem Grunde war -pedantic bei mir nicht pedantisch genug 😕
    Es scheint also, dass so oder so irgend ein Name für etwas (Typ oder Variable nach Belieben) eingeführt werden muss. Wie super überflüssig 😞


  • Mod

    camper schrieb:

    Ok. Schön. Aus irgendeinem Grunde war -pedantic bei mir nicht pedantisch genug 😕

    Das ist ein Warnflag ("kurz"form für -Wpedantic ), und eine Warnung ist damit auch alles, was es bewirken kann.

    camper schrieb:

    Es scheint also, dass so oder so irgend ein Name für etwas (Typ oder Variable nach Belieben) eingeführt werden muss. Wie super überflüssig 😞

    Müsste man eigentlich standardisieren, ich sehe wie oben erwähnt nicht direkt, was dagegen spricht. In C funktioniert es ja.



  • Arcoth schrieb:

    Visual C++ ist zumindest im Frontend auf EDG basiert

    Der VC++-Compiler verwendet nicht das EDG-Frontend; das wird nur fürs Intellisense eingesetzt.


Anmelden zum Antworten