Bonjour à tous,
J'ai un problème avec l'utilisation des weak_ptr, je voudrais faire 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;
}
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
 
template<typename T> bool operator== (weak_ptr<T> const& wptr, T* const ptr)
{
  return wptr.lock().get() == ptr;
}
(on passe le fait qu'il faudrait vérifier la vitalité du shared_ptr renvoyé par lock())
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:
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();
}
et en utilisant un find_if à la place du find:
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);
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?

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.