URL: https://linuxfr.org/users/serge_ss_paille/journaux/jouons-avec-le-switch-et-c-17 Title: Jouons avec le ``switch`` et C++17 Authors: serge_sans_paille Date: 2018年03月05日T22:47:26+01:00 License: CC By-SA Tags: c++17 Score: 27 Et non, ceci n'est pas un journal sur **la** switch, juste un partage rapide et amusé d'une version alambiquée mais qui fait tourner la tête (comme beaucoup de choses sortant d'un alambic, n'est ce pas ?): ```c++ template __attribute__((noinline)) void stuff() {} // manual switch void manual_switch(int i) { switch(i) { case 0: return stuff<0>(); case 1: return stuff<1>(); case 2: return stuff<2>(); case 3: return stuff<3>(); default: return stuff<100>(); } } ``` ce code a l'air de rien. On peut imaginer que ``stuff`` ait une bonne raison d'être ``template``, et le ``switch`` est là pour passer du monde dynamique au monde statique. Je vous propose une version équivalente en C++17 : ```c++ namespace bits { template void meta_switch(int i, std::index_sequence) { ((i==N && (stuff(), true)) || ...) || (stuff<100>(), true); } } void meta_switch(int i) { return bits::meta_switch(i, std::make_index_sequence<4>()); } ``` Premier constant : c'est pas ultra lisible. mais ça fait parti du charme (de l'hètre ?). On notera en vrac et dans le désordre : - l'utilisation d'une [*fold expression* ](http://en.cppreference.com/w/cpp/language/fold), cru 2017, pour chainer les conditions - l'évaluation paresseuse des opérateurs ``&&`` et ``||`` pour gérer le ``default`` et le chaînage - le vieux *trick* ``(stuff(), true)`` qui ne crée par un tuple mais évalue ``stuff`` puis renvoie ``true`` pour palier à l'absence de valeur de retour de ``stuff`` Mais la chose la plus savoureuse, c'est l'assembleur généré par clang dans ces deux cas, que je vous livre sur [godbolt](https://godbolt.org/g/yK6VNy). C'est exactement le même, ce qui est quand même poilant (poil aux dents). Bref, le C++, c'est parfait pour l'ivresse du soir !

AltStyle によって変換されたページ (->オリジナル) /