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é :
1 2 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 :
1 2 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 :
1 2 3 4 5 6 7 8 9 10
| template <typename Function>
struct initializer
{
};
template <typename Function>
struct initializer<template <class> class Function>
{
}; |
ou encore
1 2 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