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.
Partager