Bonjour à tous,
J'ai un problème avec l'utilisation des weak_ptr, je voudrais faire un truc du genre:
En gros, je cherche si un pointeur (l'adresse de element) est présent sous sa forme weak_ptr dans ma liste ref_tab. Le truc c'est qu'il n'y a pas d'opérateur de comparaison entre un weak_ptr et un pointeur brut un truc du genre
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 int main(void) { using namespace std; using namespace boost; vector<shared_ptr<int>> tab; for (int i=0; i<10; ++i) tab.push_back(shared_ptr<int>(new int(i))); vector<weak_ptr<int>> ref_tab; ref_tab.push_back(tab[0]); ref_tab.push_back(tab[3]); ref_tab.push_back(tab[7]); int& element(*tab[0]); vector<weak_ptr<int>>::iterator it = find(ref_tab, &element); if (it != ref_tab.end()) std::cout << "trouve\n": else std::cout << "non trouve\n"; return 0; }
(on passe le fait qu'il faudrait vérifier la vitalité du shared_ptr renvoyé par lock())
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename T> bool operator== (weak_ptr<T> const& wptr, T* const ptr) { return wptr.lock().get() == ptr; }
Si je défini l'opérateur == avant mon main, il n'est pas pris en compte dans l'algorithme find (error C2678: "==" binaire : aucun opératuer trouvé qui accepte un opérande de partie gauche de type boos::weak_ptr<T>...)
J'ai réussi à m'en sortir avec une méthode get_ptr:
et en utilisant un find_if à la place du find:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int* get_ptr(weak_ptr<int>& ptr) { return wptr.lock().get(); }
Alors ça marche mais ça m'éloigne pas mal de la logique initiale qui est de "simplement" rechercher si element est référencé dans ref_tab. Avez vous des idées, pour soit que la surcharge de l'opérateur == soit prise en compte ou que la recherche du référencement d'un élément soit plus proche de mon premier code?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 vector<weak_ptr<int>>::iterator it = find_if(ref_tab, bind(get_ptr, _1) == &element);
Merci
PS: les algorithmes find et find_if sont ceux de la version rangeEx de boost ils appellent simplement la version de la stl avec begin et end.





Répondre avec citation



(c'est toujours un exemple). Cette classe Personne dispose de deux méthodes:





Partager