SFINAE support



  • Hi,
    ich würde gerne wissen, ob bzw. seit wann SFINAE im C++-Standard aufgeführt wird, bzw. kann ich davon ausgehen, dass SFINAE ala boost::enable_if von einem C++98-Compiler unterstüzt wird?
    Meine da mal irgendwas von C++11 im Zusammenhang mit SFINAE gelesen zu haben... wohingegen das Platformtoolset msvc-9.0 mit boost::enable_if aber klar kommt. Ist das im msvc-9.0-Compiler also nur so ne Vorabunterstützung?



  • Es gibt grundsätzlich zwei Arten von SFINAE: Type SFINAE und Expression SFINAE.
    Letzeres wurde in C++11 eingeführt und macht insbesondere bei allen außer der allerneusten MSVC Version Probleme.
    Type SFINAE ist bspw. typename T::something für T ohne something oder int array[N] für [c]N = 0[c].
    Expression SFINAE ist SFINAE für generell alle Expressions.
    Details gibts hier: http://en.cppreference.com/w/cpp/language/sfinae



  • Nathan schrieb:

    Es gibt grundsätzlich zwei Arten von SFINAE: Type SFINAE und Expression SFINAE.
    Letzeres wurde in C++11 eingeführt und macht insbesondere bei allen außer der allerneusten MSVC Version Probleme.

    Ok hat mir geholfen, danke.


  • Mod

    Mr.Long schrieb:

    bzw. kann ich davon ausgehen, dass SFINAE ala boost::enable_if von einem C++98-Compiler unterstüzt wird?

    Ja, von einem konformen:

    C++98 [temp.deduct]/2 schrieb:

    If a substitution in a template parameter or in the function type of the function template results in an invalid type, type deduction fails.

    Die darauf folgende Liste von Beispielen enthält den für enable_if relevanten Teil (Nichtexistenz eines genannten Members).

    Ist das im msvc-9.0-Compiler also nur so ne Vorabunterstützung?

    VC++ hat bis vor kurzem nur die traditionelle Art von SFINAE unterstützt, nämlich die, die in C++98 explizit vorgeschrieben war (i.e. die genannte Liste). Schließlich ist die Implementierung von expression SFINAE mit Schwierigkeiten beim mangeln etc. verbunden, weswegen die meisten Compiler auch erst seit der Aufnahme eines gewissen proposals diese Form von SFINAE implementiert haben. Das es so lange gedauert hat ist jedoch trotzdem fast lächerlich.



  • Arcoth schrieb:

    Mr.Long schrieb:

    bzw. kann ich davon ausgehen, dass SFINAE ala boost::enable_if von einem C++98-Compiler unterstüzt wird?

    Ja, von einem konformen

    Wie wahrscheinlich ist denn, dass irgendein Compiler nicht konform ist? Sollte man evtl. wenn man nicht genau weiß, mit welchen Compilern ein Programm compiliert wird auf sowas wie boost::enalbe_if verzichten?


  • Mod

    Mr.Long schrieb:

    Sollte man evtl. wenn man nicht genau weiß, mit welchen Compilern ein Programm compiliert wird auf sowas wie boost::enalbe_if verzichten?

    Das hängt schlicht und einfach davon ab, welche Compiler unterstützt werden müssen. Ich schätze jedoch, dass die meisten halbwegs aktuellen Versionen gängiger Compiler damit keinerlei Probleme haben werden. enable_if ist relativ weit verbreitet und damit im Prinzip eine obligatorische Angelegenheit.



  • Nutze am besten CI oder so, um dein Projekt unter verschiedensten Compilern zu testen, ich mache das bapw. mittels Travis CI und Appveryor unter fünf verschiedenen.


  • Mod


Log in to reply