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.
'mem_fn' ist auch verfügbar in MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –
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! –