2010-11-22 3 views
6

Ich habe vor kurzem die Entscheidung getroffen, einen Vektor von Zeigern in einen Vektor von Smartpointern zu ändern, aber obwohl diese Smartpoints STL-kompatibel sind, konnte ich einige Algorithmen nicht umwandeln .mit mem_fun() für Container von Smart-Zeigern

Betrachten wir ein

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

Wie Sie

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

in dieses Format konvertieren?

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)); 
} 

können Sie davon ausgehen, dass my_smart_pointer <> hat im Wesentlichen die gleiche Schnittstelle wie shared_ptr <>, aber ich kann nicht Schub in meinem Projekt verwenden.

Gibt es einen (generischen) Adapter, den ich schreiben könnte, damit mem_fun oder mem_fun_ref funktionieren? Ich sehe vorzugsweise für einen Inline-Lösung, wie:

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

denn es gibt viele ähnliche Vorkommnisse solcher Linien sind.

Antwort

4

Sie möchten Boost mem_fn verwenden, da es genau das tut, was Sie wollen. Sehen Sie sich diesen Link an, insbesondere den Abschnitt PURPOSE.

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

BTW, sollten Sie einen Verweis auf const werden vorbei, und nicht die gesamte Vektor in is_any_valid (und Ihrem gültig() soll const als auch sein).

+0

'mem_fn' ist auch verfügbar in MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –

+0

ja, genau das, was ich brauche. Nur (nachdem ich den Code gelesen habe) kann ich nicht verstehen, warum sie nicht auch den Verweis auf einen nichtkonstanten Fall implementiert haben! –