L'une des méthodes membres de ma classe prend comme argument le type d'énumération: elle produit différents effets secondaires pour différentes énumérations. Je me demandais s'il est possible d'utiliser le modèle comme une table de consultation, deux solutions possibles sont venus à l'esprit, mais aucun d'entre eux ne semble fonctionner:Instancier un modèle avec un type modifié de manière variable
//// 1 ////
class A {
public:
enum AEnum : uint8_t { first, second, ... };
private:
template<AEnum N, typename T>
struct impl {
static void do_sth(T t) { ... };
};
template<typename T>
struct impl<first, T> {
static void do_sth(T t) { ... };
};
public:
template<typename T>
void do_sth(AEnum e, T t) {
impl<e, T>::do_sth(t);
}
}
//// 2 ////
class A {
public:
enum AEnum : uint8_t { first, second, ... };
private:
template<typename T_enum, typename T>
struct impl {
static void do_sth(T t) { ... };
};
template<typename T>
struct impl<uint8_t[2], T> { // A::first
static void do_sth(T t) { ... };
};
public:
template<typename T>
void do_sth(AEnum e, T t) {
impl<uint8_t[static_cast<uint8_t>(e) + 1u], T>::do_sth(t);
}
}
Est-il très mauvaise idée de le coder de cette façon?
@Oli Charlesworth
Quel est le problème avec une instruction switch?
Les types pris en charge du second argument de do_sth (T) varient avec la valeur de e, par ex. A :: soutient le premier Intégrales, et A :: seconde conteneurs STL, .: par exemple
template<typename T>
void do_sth(AEnum e, T t) {
switch(e) {
case first:
std::cout << &t << std::endl;
break;
case second:
std::cout << t.data() << std::endl;
break;
default:
break;
}
A a;
a.do_sth(A::first, 0);
Et ainsi, que devrait-il se passer si e est la deuxième à l'exécution et t est un int? Il semble que toute sélection puisse avoir lieu au moment de la compilation, auquel cas on ne sait pas du tout à quoi l'énumération est nécessaire. – UncleBens
Il n'est pas possible que t soit de type int au moment de l'exécution car il ne sera même pas compilé. J'ai trouvé en rapport à propos de sfinae, pense que ça devrait faire l'affaire. – erjot