Gegeben ist Folgendes:
%Vor% Ich habe einen Container mit Foo*
und verwende std::find_if
und std::not1
, um herauszufinden, ob es Elemente im Container gibt, in denen bar()
etwas anderes als einen gegebenen Wert zurückgibt. Der Code sieht so aus:
Schnell vorwärts in die Zukunft und ich habe jetzt einen anderen Container, der diesmal std::tr1::shared_ptr<Foo>
enthält. Ich würde gerne meinen Funktor in einer überladenen Version von isAllEqual()
einfach wiederverwenden. Aber ich kann nicht. Foo*
und shared_ptr<Foo>
sind unterschiedliche Typen. Und ich muss von unary_function
erben, damit ich not1
verwenden kann. Es wäre eleganter, wenn ich es vermeiden könnte, denselben Funktor zweimal zu schreiben.
Fragen:
IsEqual
zu schreiben, sodass sowohl rohe als auch intelligente Zeiger verwendet werden können? std::not1
benutzt habe? Soll ich stattdessen nur IsNotEqual
schreiben? Einschränkungen:
Bens Antwort ist wirklich das einzige, was Sie in c ++ 03 tun können. In C ++ 0x though und / oder mit boost :: bind müssen Sie nicht von unary_function erben. Auf diese Weise können Sie einen Vorlagenoperator () verwenden. In C ++ 03 kann man normalerweise mit dem gleichen Ergebnis davonkommen, aber ich denke, dass es technisch falsch ist, dies zu tun.
Tags und Links c++ smart-pointers adapter functor