J'ai une question de C++, vu que je suis un peu paumé (et j'ai plus de pied à force de me tirer des balles dedans).
En gros j'ai un code de ce genre là (j'essaie apparement d'implémenter un FSM de façon aussi verbeuse que possible)
Code:
template<typename Roger...>
struct Base
{
struct Base_E1 {
std::variant<Roger::Rabbit...> _varA;
template<typename Robert>
A(Robert::Rabbit rob) : _varA(rob) {}
};
struct Base_E2 {
std::variant<Roger::Rabbit...> _varB;
template<typename Robert>
B(Robert::Rabbit rob) : _varB(rob) {}
};
template<typename S>
auto f(const S&, const Base_E1&e) { std::get<S::Rabbit>(e._varA); //etc }
template<typename S>
auto f(const S&, const Base_E2&e) { std::get<S::Rabbit>(e._varB); //etc }
};
et ensuite
Code:
struct S1 {};
struct S2 {};
struct E1 {};
struct E2 {};
struct Subclass : public Base<Alice, Bob> // Alice et Bob sont deux struct avec Rabbit dedans i.e. Alice::Rabbit et Bob::Rabbit existent
{
auto f(const S1&, const E1&) {}
auto f(const S2&, const E2&) {}
template<typename S, typename E> // catch all qui est censé faire planter le truc quand la transition E pour l'état S n'est pas prévue
auto f(const S&, const E&) { assert(false); }
};
Mon problème, c'est que quand je fais :
Code:
instance_de_Subclass.f(S1, Base<Alice, Bob>::Base_E1({Alice::Rabbit{}}))
Je me retrouve dans la version catch-all, alors que je voudrais que la version de f définie dans Base soit appelée. Est-ce que c'est une histoire ou il faut descendre le "template<typename Roger...>" devant Base_E1 et Base_E2 plutôt que de templater Base directement? Honnêtement j'ai tatonné jusqu'à avoir un truc qui compile mais je pense que j'ai raté quelque chose (clairement). Peut-être que la déduction de type préfère trouver le catch-all d'abord parce qu'il est dans la classe fille et ensuite va chercher dans la classe mère?