Kann ich einen C ++ - Funktor schreiben, der sowohl einen rohen als auch einen intelligenten Zeiger akzeptiert?

8

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:

%Vor%

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:

  • Gibt es eine Möglichkeit, IsEqual zu schreiben, sodass sowohl rohe als auch intelligente Zeiger verwendet werden können?
  • Habe ich mir Handschellen angelegt, indem ich std::not1 benutzt habe? Soll ich stattdessen nur IsNotEqual schreiben?

Einschränkungen:

  1. Ich kann nichts aus der Boost-Bibliothek verwenden.
  2. Unser Compiler ist nicht cool genug, um C ++ 0x lambdas zu unterstützen.
Michael Kristofik 13.12.2010, 20:25
quelle

5 Antworten

2
%Vor%     
user405725 13.12.2010, 20:49
quelle
8

Wie wäre es mit:

%Vor%     
Ben Voigt 13.12.2010 20:32
quelle
2

Mein Foto wäre ungefähr so:

%Vor%

Sie haben eine andere operator() Instantiierung für alles dereferenzierbare mit -> , also rohe Zeiger und intelligente Zeiger.

    
Kos 13.12.2010 20:29
quelle
1

Sie könnten vielleicht etwas mit impliziten Konvertierungen machen:

%Vor%

Aber ich würde wirklich lieber ein IsNotEqual schreiben.

    
aschepler 13.12.2010 20:37
quelle
0

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.

    
Crazy Eddie 13.12.2010 20:40
quelle