On veut pouvoir caster un String<...> en String<IBuffer>. Ceci fonctionne
sur le compilateur qu'on utilise, grâce au fait que toutes les instances de
Buffers, quelque que soit leur type (IBuffer, BufferA, BufferB), ont comme
premiers 4 octets un pointeur vers un vtable de même type.
Quelle est la façon propre de faire ca en "vrai" C++ ?
Les contraintes sont :
- on ne veut pas que la classe String grossisse (même pas d'un pointeur vers
une vtable)
- on ne veut pas forcer bar à être une fonction template
On veut pouvoir caster un String<...> en String<IBuffer>. Ceci fonctionne sur le compilateur qu'on utilise, grâce au fait que toutes les instances de Buffers, quelque que soit leur type (IBuffer, BufferA, BufferB), ont comme premiers 4 octets un pointeur vers un vtable de même type.
Quelle est la façon propre de faire ca en "vrai" C++ ? Les contraintes sont : - on ne veut pas que la classe String grossisse (même pas d'un pointeur vers une vtable) - on ne veut pas forcer bar à être une fonction template
-- Vincent
Bonjour,
J'ose la question bête qu'il ne faut sans doute pas poser :-)
A quoi sert la classe String, considérant que:
void bar(IBuffer* s)
{
s->foo();
}
int main()
{
BufferB buffer;
bar(&buffer);
}
semble suffire ? Je me permets la question car si String ne doit pas
grossir, pourquoi ne pas carrément la supprimer ? :-)
Bien cordialement
Fred
"Vincent Lascaux" <nospam@nospam.org> a écrit dans le message de news:
44a0c7f9$0$25490$626a54ce@news.free.fr...
Bonjour,
J'ai récemment été confronté au design suivant :
#include <iostream>
On veut pouvoir caster un String<...> en String<IBuffer>. Ceci fonctionne
sur le compilateur qu'on utilise, grâce au fait que toutes les instances
de Buffers, quelque que soit leur type (IBuffer, BufferA, BufferB), ont
comme premiers 4 octets un pointeur vers un vtable de même type.
Quelle est la façon propre de faire ca en "vrai" C++ ?
Les contraintes sont :
- on ne veut pas que la classe String grossisse (même pas d'un pointeur
vers une vtable)
- on ne veut pas forcer bar à être une fonction template
On veut pouvoir caster un String<...> en String<IBuffer>. Ceci fonctionne sur le compilateur qu'on utilise, grâce au fait que toutes les instances de Buffers, quelque que soit leur type (IBuffer, BufferA, BufferB), ont comme premiers 4 octets un pointeur vers un vtable de même type.
Quelle est la façon propre de faire ca en "vrai" C++ ? Les contraintes sont : - on ne veut pas que la classe String grossisse (même pas d'un pointeur vers une vtable) - on ne veut pas forcer bar à être une fonction template
-- Vincent
Arnaud Meurgues
Vincent Lascaux wrote:
On veut pouvoir caster un String<...> en String<IBuffer>.
N'est-il pas possible de faire un operator de cast template :
Quelle est la façon propre de faire ca en "vrai" C++ ?
Un constructeur template pour String prenant n'importe quel autre String et initialisant son buffer à partir du buffer de l'autre, ça ne conviendrait pas ? Et si le buffer n'est pas « compatible », on a une erreur à la compilation.
-- Arnaud
Vincent Lascaux wrote:
On veut pouvoir caster un String<...> en String<IBuffer>.
N'est-il pas possible de faire un operator de cast template :
Quelle est la façon propre de faire ca en "vrai" C++ ?
Un constructeur template pour String prenant n'importe quel autre String
et initialisant son buffer à partir du buffer de l'autre, ça ne
conviendrait pas ?
Et si le buffer n'est pas « compatible », on a une erreur à la compilation.
Quelle est la façon propre de faire ca en "vrai" C++ ?
Un constructeur template pour String prenant n'importe quel autre String et initialisant son buffer à partir du buffer de l'autre, ça ne conviendrait pas ? Et si le buffer n'est pas « compatible », on a une erreur à la compilation.
-- Arnaud
Arnaud Meurgues
Arnaud Meurgues wrote:
N'est-il pas possible de faire un operator de cast template : [...] template <typename AnyBuffer> String<AnyBuffer> operator() { return String<AnyBuffer>(*this); }
Oups. Ça, c'était une première idée que j'ai oublié d'enlever du message. Le constructeur devrait suffire.
Évidemment, si on passe les String par pointeur, ça ne fonctionne pas. -- Arnaud
Arnaud Meurgues wrote:
N'est-il pas possible de faire un operator de cast template :
[...]
template <typename AnyBuffer>
String<AnyBuffer> operator() {
return String<AnyBuffer>(*this);
}
Oups. Ça, c'était une première idée que j'ai oublié d'enlever du
message. Le constructeur devrait suffire.
Évidemment, si on passe les String par pointeur, ça ne fonctionne pas.
--
Arnaud
N'est-il pas possible de faire un operator de cast template : [...] template <typename AnyBuffer> String<AnyBuffer> operator() { return String<AnyBuffer>(*this); }
Oups. Ça, c'était une première idée que j'ai oublié d'enlever du message. Le constructeur devrait suffire.
Évidemment, si on passe les String par pointeur, ça ne fonctionne pas. -- Arnaud
Jean-Marc Bourguet
"Vincent Lascaux" writes:
Bonjour,
J'ai récemment été confronté au design suivant : #include <iostream>
Si tu peux aussi ajouter une classe StringPtr les operator-> qui vont bien (String->StringPtr->StringRef*) pour faire en sorte que
sa->baz()
fonctionne.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Vincent Lascaux" <nospam@nospam.org> writes:
Bonjour,
J'ai récemment été confronté au design suivant :
#include <iostream>
Si tu peux aussi ajouter une classe StringPtr les operator-> qui vont
bien (String->StringPtr->StringRef*) pour faire en sorte que
sa->baz()
fonctionne.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Si tu peux aussi ajouter une classe StringPtr les operator-> qui vont bien (String->StringPtr->StringRef*) pour faire en sorte que
sa->baz()
fonctionne.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Vincent Lascaux
J'ose la question bête qu'il ne faut sans doute pas poser :-)
A quoi sert la classe String
Mon exemple est trop simplifié. On tient à avoir une distinction entre "chaine de caracteres" et "buffer". String n'offre en réalité pas la même interface que Buffer, une String utilise un Buffer en interne, mais l'utilisateur n'a pas à le savoir, et une String n'est pas un Buffer.
Vincent
J'ose la question bête qu'il ne faut sans doute pas poser :-)
A quoi sert la classe String
Mon exemple est trop simplifié. On tient à avoir une distinction entre
"chaine de caracteres" et "buffer". String n'offre en réalité pas la même
interface que Buffer, une String utilise un Buffer en interne, mais
l'utilisateur n'a pas à le savoir, et une String n'est pas un Buffer.
J'ose la question bête qu'il ne faut sans doute pas poser :-)
A quoi sert la classe String
Mon exemple est trop simplifié. On tient à avoir une distinction entre "chaine de caracteres" et "buffer". String n'offre en réalité pas la même interface que Buffer, une String utilise un Buffer en interne, mais l'utilisateur n'a pas à le savoir, et une String n'est pas un Buffer.
Vincent
Vincent Lascaux
Évidemment, si on passe les String par pointeur, ça ne fonctionne pas.
Et copier un buffer est d'une part très long, d'autre part une mauvaise idée parceque bar va alors travailler sur une mauvaise string
-- Vincent
Évidemment, si on passe les String par pointeur, ça ne fonctionne pas.
Et copier un buffer est d'une part très long, d'autre part une mauvaise idée
parceque bar va alors travailler sur une mauvaise string