Frage

Betrachten Sie eine Template-Klasse wie:

template<typename ReturnType, ReturnType Fn()>
class Proxy
{
    void run()
    {
        ReturnType ret = Fn();
        // ... do something ...
    }
};

// and a functions
int fn1() { return 5; }
float fn2() { return 5; }

Dies kann durch Verwendung instanziiert werden:

Proxy<int, &fn1> p1;

Aber explizit den Rückgabewert Typ erklärt scheint überflüssig. Was ich versuche zu erreichen ist so etwas wie:

 someProxyInstantation<&fn1> p1;
 someProxyInstantation<&fn2> p2;

Leider bin ich kein C ++ erwarten und dies scheint wie eine versteckte Ecke der Sprache (zumindest für mich).

Wenn ich könnte nur von dem Zeiger auf die Funktion seiner Art erhalten - so etwas wie:      :: std :: tr1 result_of <& fn> :: type // Fehler 1 Fehler C2923: 'std :: tr1 :: result_of': 'fn1' ist kein gültiges Template-Typ Argument für den Parameter '_Fty'

der Fehler macht Sinn, da der Parameter nicht ein „Typ“ überhaupt ist

C ++ 0x hat die decltype (& FN1), aber das ist Jahre entfernt.

Jede Art und Weise, dies zu tun in C ++ 03 (+ TR1)?

Einschränkungen:  -. Ich will nicht die Funktors, f1 und f2 passieren müssen, um globale Funktionen bleiben die einen Rückgabewert haben (kann es nicht zu Parameter bewegen))

War es hilfreich?

Lösung

Dies ist nicht möglich, in C ++ 03. Wenn Sie einen Funktionszeiger als Nicht-Typ-Parameter übergeben werden soll, hat der Compiler den Typ des Parameters kennen. So haben Sie die fehlenden Stücke liefern (in diesem Fall der Rückgabetyp). Sie können dem Proxy die Funktionszeiger als Wert zur Laufzeit geben, und es mit der Art der es als einziges Argument liefern. Dann könnten Sie eine Generatorfunktion für Sie schreiben, dass diese Arbeit tut:

template<typename T>
Proxy<T> make_proxy(T t) { return Proxy<T>(t); }

Leider in der aktuellen C ++, Sie immer noch geben, haben es die Art, um eine automatische Variable zuweisen:

Proxy<int(*)()> p = make_proxy(&fn1);

Sie können nicht auto p = make_proxy(&fn1); noch verwenden. Beachten Sie, dass, wenn Sie einen Funktionstyp auf der linken Seite verwenden möchten, müssen Sie die Generatorfunktion ändern nicht einen Funktionszeiger Art zu schaffen:

template<typename T>
Proxy<typename boost::remove_pointer<T>::type> make_proxy(T t) { 
    return Proxy<typename boost::remove_pointer<T>::type>(t); 
}

Jetzt können Sie tun

Proxy<int()> p = make_proxy(&fn1);

den Proxy verwenden, können Sie jetzt nur tun

doSomething(make_proxy(&fn1));

Und wenn doSomething Templat-oder anderweitig polymorph ist, es wird nicht die genaue Art der Funktion wissen erfordern.

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