C'est ce qu'est la classe "Resizer" dans mon exemple: un proxy.
Ça fonctionne, avec std:map aussi, ce qui me gène c'est que le proxy n'est jamais const, ou alors il faut le préciser avec un cast (ça se fait d'ailleurs plutôt avec une classe ConstProxy il me semble).
Exemple: les données dans le conteneur sont en réalité accesible par connexion réseau. Lors de la création du proxy, on peut être (presque) sûr que la connexion réseau devra être ouverte pour connaître ou modifier la taille du conteneur. Par contre, pour modifier la taille il faut passer la connexion réseau en mode sécurisée deux fois plus lente. La connexion persistante est une propriété de la classe Container.
Mais lorsque l'on écrit:
Code :
- void auto_agrandir_conteneur(Container& c, size_t n)
- { if(n>c.length()) c.length()=n; }
|
une connexion sécurisée est toujours ouverte plutot que: une connexion normale est ouverte, puis passage en sécurisé seulement si la taille est plus petite que 'n'.
Celà n'empêche pas std::map de fonctionner de manière optimale, ni l'exemple que je donne au début, puisque le compilo va de toutes façon aller regarder dans le code inliné, et faire les optims necessaires parceque tout se passe en mémoire et dans les registres. Mais dans des cas plus complexes... le compilo n'a pas accès à la connexion réseau par exemple pour déterminer qu'il n'y a en fait pas besoin d'ouvrir une connexion sécurisée.
ou alors, il faut préciser:
Code :
- void auto_agrandir_conteneur(Container& c, size_t n)
- { if(n>(ConstResizer)c.length()) c.length()=n; }
|
et c'est là que je trouve ça un poil surchargé et buggogène (la fonction length() semble s'occuper de tout d'aspect extérieur). Du coup la solution de donner des noms distincts aux deux fonctions length() est plus pratique. Idem, length(int), même si plus court syntaxiquement, est contre-intuitif (pourquoi deux fonctions length()??), alors que l'opérateur = ou la fonction setLength(int) sont absolument explicites.
Edit: ça y est, je comprends mon erreure.. le proxy dont tu parles c'est sur le conteneur qu'il faut le placer, pas sur sa taille.
Message édité par nargy le 13-12-2007 à 09:29:05