contourner les fonctionnalités manquantes au C++11 de façon standard
Bonjour,
Je suis tombé hier sur un problème qui me turlupine depuis.
Voyez-vous, j'ai dans mon code besoin de passer une lambda prenant en paramètre un type inconnu à la compilation, mais qui ait comme caractéristique d'être un flux sur lequel divers operator>> sont disponibles.
M'étant renseigné, j'ai appris qu'il s'agissait là des lambdas polymorphiques, qui apparemment n'existent pas en C++11, pour une obscure raison de concepts, tout aussi inexistants également.
J'ai essayé de résoudre ce problème (parce que oui, faut bien avancer) avec du type-erasure. Mal m'en a pris ! Je suis tombé fatalement sur une autre fonctionnalité manquante du C++ : les templates virtuels.
Ne pouvant les utiliser, j'en suis réduit au code suivant, pas du tout flexible puisqu'il faut le modifier pour chaque type de donnée, et une contrainte de plus est que la donnée doit être disponible sur tous les types de flux que j'envisage d'utiliser (pour l'instant sf:: Packet et std::istream, mais rien ne me dis que je ne vais pas en ajouter).
(je n'ai mis en exemple que la version pour les int)
Code:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class istr
{
private:
class streamBase
{
public:
streamBase() {};
virtual ~streamBase() {};
template <class D>
void extract(D &d)
{
get(d);
}
protected:
virtual void get(int &d) = 0;
};
template <class S>
class streamObject: public streamBase
{
public:
streamObject(S &iss): m_iss(iss) {};
virtual ~streamObject() {};
protected:
virtual void get(int &d){extract(d);}
template <class D>
void extract(D &d)
{
m_iss >> d;
}
private:
S &m_iss;
};
std::unique_ptr<streamBase> stream;
public:
template <class R>
istr(R &iss): stream(new streamObject<R>(iss)) {}
virtual ~istr() {};
template <class T>
inline istr& operator>>(T& var)
{
return *this;
}
}; |
Y-a-t-il des solutions connues pour résoudre ce problème de façon standard au C++11 ? Avez-vous des pistes pour résoudre le problème des templates virtuels ou des lambdas polymorphiques ?
D'avance merci pour vos réponses.