J'ai une classe qui g�re un conteneur d'objets T. Je souhaite que ma classe n'impose pas de contraintes sur T, ou le moins possible.
Voici � quoi ressemble la classe:En l'�tat actuel, la seule contrainte est la n�cessit� pour T d'avoir un constructeur par d�faut (pas de copy constructor, pas d'assign operator, ni aucun autre operator).
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 template<class T> class MyContainer { ... container<mystery<T>::mystery_type> items; public: ... ret_val<T> foo(param_type ...) { ... if (some_condition) { ... void *vptr=acquire_some_memory(...); T *p=new(vptr) T;//<--contrainte ici items.insert(..., *p); ... } ... } };
J'aimerais aller plus loin en supprimant cette derni�re contrainte sans changer le prototype de la m�thode foo(). Je pense que c'est possible en faisant un peu comme les factory de boost (dans le code, on suppose que T ne poss�de qu'un seul constructeur qui exige 3 param�tres):factory<T> serait donc un foncteur qui g�rerait la construction de T en fonction des besoins de ce dernier.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 template<class T> class factory { context & c_; public: factory(context & c): c_(c) {} T *operator()(void *vptr) { ... return new(vptr) T(c_.a1, c_.a2, c_.a3); } }; template<class T> class MyContainer { ... container<mystery<T>::mystery_type> items; factory<T> f; public: MyClass(..., factory<T> & fact, ...): f(fact), ... {...} ... ret_val<T> foo(param_type ...) { ... if (some_condition) { ... void *vptr=acquire_some_memory(...); T *p=f(vptr);//<--contrainte déplacée dans factory<T> items.insert(..., *p); ... } ... } };
Y a-t-il mieux ?
Merci.
Partager