59Fermer61
PolluxLe 10/02/2004 à 11:22
5: Euh, y a rien à comprendre. Disons que "foobar *" est (en utilisation la notion des templates) un "ptr<foobar>", et tu peux modifier ce que désigne ptr<foobar> sans pour autant le modifier (donc *const ptr<foobar> n'est pas un "const foobar" mais un "foobar" tout court). C'est pareil pour "mutable foobar" aka "mut<foobar>" : tu peux modifier le contenu de "mut<foobar>" (i.e, la valeur de type foobar) sans modifier le contenant (le wrapper). En gros, l'implémentation inefficace de mut (qu'on est presque obligé d'utiliser en C) est vaguement équivalente à :
template<class T> mut {
  T* ptr;
public:
  mut() { ptr=new T; }
  ~mut() { delete ptr; }
  operator T&() const { return *T; }
};


1: Ne fais pas semblant de ne pas avoir lu la discussion précédente... C'est clairement plus efficace en mettant "const" qu'en ne le mettant jamais, puisque le compilo va louper plein d'optimisations dans la fonction appelante, avec ta méthode... Et tu vas devoir faire un memcpy dans l'exemple de Kevin au lieu de faire un move, etc...

3: Si tu te sers des facultés d'abstraction pour écrire du code bcp plus compact (utiliser des std::string au lieu de char*, par exemple), alors évidemment ton code sera moins efficace (mais aussi plus simple). Si tu veux écrire du code aussi efficace qu'en C, tu peux. Mais en plus, tu as les templates et les mutables qui te permettent de faire encore mieux. (tu peux te servir des templates comme d'un callback hyper puissant, par exemple; dans GTC 2.0 le parser utilise à fond les templates pour décrire les expressions avec priorités et ça permet de faire un truc hyper efficace)

7: C quoi la différence entre structure et classe selon toi?