Frage

Ich habe eine Klasse, die verwendet funktoren als Einheiten der Arbeit.Es akzeptiert eine Referenz auf einen Funktor in seiner Run () - Methode.Um dies zu ermöglichen, Klasse für den Betrieb auf beliebigen funktors, all diese funktoren müssen Ableitung von meiner base functor-Klasse, die wie folgt aussieht:

class baseFunctor{

public:
    virtual void operator()()=0;
    virtual baseFunctor Clone()=0;
};

Dies funktioniert jedoch offensichtlich schränkt diese funktoren, um mit einem operator-Methode, die void zurückgibt und akzeptiert keine Parameter.Ich muss in der Lage zu akzeptieren, die einen Funktor in meiner Klasse, dass kann jede Art von Parametern und etwas zurückzugeben.Seine scheinbar tun können, aber ich kann nicht scheinen, einen Weg finden, es zu tun.Ich habe als Vorlagen verwenden, Mehrfachvererbung, aber ich bekomme immer wieder konterkariert durch die Tatsache, dass die Klasse, die ausgeführt werden muss dieses funktors muss in der Lage sein, Sie zu akzeptieren, jeder Art, so nehmen die Basisklasse geben, und so werden Sie nicht wissen, die tatsächliche Art des funktors.

Irgendwelche Vorschläge, was die avenue zu schauen, würde geschätzt werden.

War es hilfreich?

Lösung

Wie wird die Klasse, die Aufrufe der Funktor wissen, welche Parameter Sie bieten und was zu tun ist mit der return-Wert, wenn irgendwelche?

Andere Tipps

Also, wenn ich lese dieses rechts haben Sie ein "Besucher-Muster." Es könnte eine gute Sache für Sie zu suchen.

Jemand muss wissen, welche Art der Funktor ist, um ihm Argumente.Oft mit funktoren, die Argumente zugeordnet sind Felder der abgeleiteten Klasse und operator() betätigen sich auf diese Felder.Das ist das dumme Methode, nennt den Funktor und weiß nicht, nichts über es ist angesichts der Schließung (Methode plus Argumente, die alle in einer Klasse) durch jemand mehr wissen.

Wenn Sie wollen, generische funktoren, die mehrere Argumente, die in der operator - (), Template erhalten Sie teilweise da, aber Sie benötigen eine pro Dimension.

Ich Stimme mit Neil.Ihre main-Klasse ist, zu wissen, welche Parameter zu übergeben, und was Rückgabewert zu erwarten, dass aus diesen funktoren.Können Sie geben einfach-Gießen Sie Ihre "Funktor", um eine entsprechende Klasse, die die Funktion unterstützt, mit der notwendigen Argumente und Rückgabewert?

class baseFunctor
{
};

class functor1x2: public baseFunctor
{
public:
    virtual void* execute(void*, void*);

}

class MainClass
{
public:
   void Execute(baseFunctor* ipFunctor)
   {
      functor1x2* lpFunctor1x2 = dynamic_cast<functor1x2*>(ipFunctor);
      if(lpFunctor1x2)
      {
         lpFunctor1x2->execute(NULL, NULL);
      }
   }
}

Ich bin mir nicht sicher, was erreicht werden könnte, mit diesem Ansatz konnte nicht mehr leicht erreicht werden, mit dem Besucher Bild, da Zog hingewiesen.

Wenn Sie offen sind, um mit dem Boost-Bibliothek (www.boost.org), finden Sie vielleicht ein Boot.Bind und Boost.Funktion von besonderem Interesse.Ich habe Sie in der Vergangenheit, etwas zu erreichen, sehr viel entlang der Linien von dem, was Sie diskutieren.

Wenn Sie die Verwendung von Boost.Binden Sie ausführen kann, currying auf die funktoren zur Konto für Unterschiede zwischen der Anzahl der Argumente des funktors erwartet, und die Anzahl der Argumente, die die Run-Methode erwartet (also null).Der code zur Erstellung des funktors hätte binden die Argumente, die für bestimmte Werte und schaffen damit ein null-argument-Funktor, der übergeben werden kann, um die Run () -.

MV

Warum würden Sie wollen, um Rückkehr die functor?Speichern Sie einen Status als gut?Etwas genauer, wird sehr geschätzt, da es nicht ganz klar, was genau Sie tun möchten.

Wenn Sie planen, verwenden Sie die Vererbung, nachschlagen, Kovariante Rückgabetypen (und die Virtual Constructor-idiom).

Nun, für das Fleisch des Problems:das problem ist nicht wirklich mit der übergabe eines funktors aber mit functor Anwendung.Möchten Sie vielleicht werfen Sie einen Blick auf boost::lambda und boost::parameter wie gut.

Ich denke, Sie wollen eine Ellipse argument, wie varargs für C++.

Vielleicht std::tr1::function ist für Sie interessant?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top