Bonjour,

Depuis ce post, j'ai fait quelques pas.

J'ai quelques questions sur le design d'une bibliothèque générique de validation et calcul de clé de contrôle.

Il y a deux actions pouvant être effectuée sur une séquence : calculer une clé de contrôle, et la valider. La seule chose qui change c'est que pour calculer la clé de contrôle il faut faire comme si elle était là, donc le compteur "saute" la position de la clé.

Pour l'utilisateur lambda, un appel de fonction comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
std::string visa_card_number = "412566...";
std::cout << validate_checksum<visa>(visa_card_number);
 
std::string visa_without_checkdigit = "4125...";
std::cout << compute_checkdigit<visa>(visa_without_checkdigit);
"visa" étant une structure encapsulant tous les détails.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
template<typename processing,
      typename checkdigit,
      std::size_t size_expected,
/* ... */
> struct features;
 
typedef features< visa_processor, 
              checkdigit<0, 1>, // position et taille de la clé de contrôle.
              VISA_SIZE,
/*...*/
> visa;
processing est un foncteur qui sera instancié plus tard et passé à std::accumulate (même si ce n'est pas le cas, c'est l'idée).

processing doit connaitre la position ! La position est stockée dans processing sous forme d'un foncteur qui a chaque appel (position() ) renvoie la position actuel.

Mais dans features, processing ne connait pas le type du foncteur de position... Je veux initialiser processing avec celui-ci dans le constructeur.

Encore un autre problème, un programmeur désire étendre la bibliothèque et crée un foncteur processing mais qui ne demande pas la position... Malheureusement, dans la mécanique interne on initialise avec la position !

Autre chose, est-ce que c'est bien de rassembler toutes les caractéristiques dans le même template ? C'est pour avoir quelque chose de plus facile à manipuler pour l'utilisateur lambda...

J'aurais encore d'autres questions mais elles viendront après, je pense que c'est déjà pas mal

Merci d'avance