Mon post a eu un succès effrayant et donc je vais quand même mettre la solution que j'ai trouvé.
Dans un premier temps j'ai utilisé :
	
	| 12
 3
 4
 5
 
 | template<template<class> class processing,
      typename checkdigit,
      std::size_t size_expected,
/* ... */
> struct features; | 
 C'est la première fois que j'ai à utiliser un template de template donc je ne savais pas trop à quoi ça servait et comment/où l'utiliser.
Ensuite je voulais pouvoir que l'utilisateur puisse initialiser processing avec la position ou avec "rien" si il n'avait pas besoin de la position. La solution que j'ai trouvé c'est :
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | template <template <class> class Function>
struct function_initializer
{
  template <typename T>
  static Function<T> init(T &arg)
  {
    return Function<T>(arg);
  }
};
 
template <class Function>
struct function_initialization_empty
{
  template <typename T>
  static Function init(T &arg)
  {
    return Function(); // arg ignoré
  }
};
 
// Exemple
template<typename processing,
      typename checkdigit,
      std::size_t size_expected,
/* ... */
> struct features;
 
typedef features< position_initializer<visa_processor>, 
              checkdigit<0, 1>, // position et taille de la clé de contrôle.
              VISA_SIZE, 
/*...*/
> visa; | 
 Par contre j'aurais bien aimé faire un truc comme ça :
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | template <typename Function>
struct initializer
{
};
 
template <typename Function>
struct initializer<template <class> class Function>
{
 
}; | 
 ou encore
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | template <size_t argc, typename Function>
struct initializer
{
};
 
template <typename Function>
struct initializer<1, template <class> class Function>
{};
 
template <typename Function>
struct initializer<2, template <class, class> class Function>
{}; | 
 mais apparement ce n'est pas possible.
En plus j'ai l'impression que ce que j'ai décrit au dessus (avec function_initializer) existe déjà quelque part mais générique pour n argument.
Finalement, est-ce que c'est mieux d'avoir un appel comme ça : 
	
	validate_checksum<visa>(visa_card_number);
 ou comme ça :
	
	checksum<validate_visa>(visa_card_number);
 D'après vous ?
Merci.
PS : Si il y a des choses qui vous choquent ou peuvent être faites plus facilement, je suis à l'écoute  
						
					
Partager