Bonjour,
J'ai plusieurs types, pour le moment tous simples (int, short, char, etc...) et pour chacun de ces types j'ai entre 1 et 5 valeurs considérées comme non valides.
C'est très majoritairement 1 valeur invalide, mais je sais aussi que ça va évoluer.
Du coup je me suis dis que les templates variadic pourraient m'aider a faire un code générique et évolutif.
En gros ce que je voudrais c'est quelque chose du genre :
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void mafonction(int value) { validator<int, 0, 7, 22> vld; // 0, 7 et 22 sont des valeur non valide if(vld.validate(value)) { // ... La valeur est valide } } void autrefonction(short value) { validator<short, 0> vld; // seul 0 est non valide ici if(vld.validate(value)) { // ... La valeur est valide } }
Sur le coup ça ne m'a pas paru si compliqué, mais c'est la première fois que j'utilises des variadic template et je ne m'en sort pas.
J'ai écris ça :
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 template <typename TValue, TValue First, TValue... Args> struct validator { bool validate(TValue value) { validator<TValue, Args...> vld; return value != First && vld.validate(value); } }; template <typename TValue, TValue First> struct validator { bool validate(TValue value) { return value != First; } };
Comme ça je me disais que s'il n'y a qu'une valeur c'est le second template qui s'en chargeait, s'il y a plus de valeur c'est le premier template qui s'en charge. Et comme il s'appel directement avec en passant "Other..." mais pas "First", du coup a chaque invocation il se "débarrasse" d'un paramètre, jusqu'a arriver au moment où il lui reste 1 paramètre, et du coup ce devrait être le second template qui prend la suite.
Sauf qu'évidemment ça ne marche pas comme ça, le premier template reste celui qui est appellé, jusqu'a ce qu'Other ne contienne plus rien et on se retrouve a appeller un validator<TValue>, qui n'est pas définit puisqu'il manque un paramètre.
Et la je bloque un peu...
J'ai testé 36 écritures différentes mais je n'arrive pas a trouver comment déclarer tout ça correctement.
Quelqu'un peut m'éclairer svp ?
Petite question bonus :
Il n'y a rien dans le standard qui permet d'obtenir une bonne valeur d'initialisation par défaut ? En gros int i = std::default<int>();, ce qui donnerait 0 pour tous les numériques, nullptr pour tous les pointeur, et l'appel au constructeur par défaut pour tous les objets (en supposant qu'il existe). J'ai créé une suite de template pour faire ça mais je les ai baclés et si ca existe dans le standard c'est con de pas les utiliser.
Partager