2010-11-22 6 views
6

J'ai récemment pris la décision de changer un vecteur de pointeurs en un vecteur de pointeurs intelligents, mais bien que ces pointeurs intelligents soient compatibles STL, je n'ai pas pu convertir certains algorithmes pour les utiliser .en utilisant mem_fun() pour conteneur de pointeurs intelligents

Tenir compte un

class Base 
{ 
    ... 
    virtual bool valid(); 
}; 

Comment convertir

bool is_any_valid(vector< Base* > v) 
{ 
    return v.end() != 
     find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

dans tout cela?

bool is_any_valid(vector< my_smart_ptr<Base> v) 
{ 
    // mem_fun() fails, because valid() is not a member of my_smart_ptr<Base> !!! 
    // return v.end() != 
    // find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

Vous pouvez supposer que my_smart_pointer <> a essentiellement la même interface que shared_ptr <>, mais je ne peux pas utiliser coup de pouce dans mon projet.

Existe-t-il un adaptateur (générique) que je pourrais écrire pour permettre à mem_fun ou à mem_fun_ref de fonctionner? je regarde de préférence pour une solution, comme en ligne:

find_if(v.begin(), v.end(), mem_fun(some_adapter(&Base::valid))); 

parce qu'il ya beaucoup de cas similaires de ces lignes.

Répondre

4

Vous voulez utiliser boost mem_fn, car il fait exactement ce que vous voulez. Regardez ce lien, en particulier la section PURPOSE.

http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html

BTW, vous devriez passer un référence à const, et non le vecteur entier dans is_any_valid (et votre valide() devrait être const aussi).

+0

'mem_fn' est également disponible dans MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –

+0

oui, exactement ce dont j'ai besoin. Seulement (après avoir lu le code) je n'arrive pas à comprendre pourquoi ils n'ont pas implémenté la référence à un cas non-const! –

Questions connexes