Extrahieren Sie den Rückgabetyp einer Funktion, ohne sie aufzurufen (mit Vorlagen?)

8

Ich suche nach einem Weg in C ++, um den Rückgabetyp einer Funktion zu extrahieren (ohne sie aufzurufen). Ich nehme an, dies wird einige Template-Magie erfordern.

%Vor%

Ich untersuche derzeit, wie magic_template implementiert werden könnte, habe aber bis jetzt noch keine Lösung gefunden.

Irgendwelche Ideen?

    
pauldoo 05.01.2010, 11:51
quelle

7 Antworten

7

Schauen Sie sich Boost Merkmale an, insbesondere die Vorlage function_traits Diese Funktionalität ist sofort verfügbar. Wenn Sie Boost nicht verwenden können, laden Sie einfach den Code herunter und lesen Sie die Quellen, um einen Einblick in die Vorgehensweise zu erhalten.

Beachten Sie, dass die Funktionalität auf Typen und nicht auf konkreten Funktionen basiert, daher müssen Sie dort möglicherweise zusätzlichen Code hinzufügen.

Nachdem Sie einige kleine Tests durchgeführt haben, ist dies möglicherweise nicht das, was Sie wirklich brauchen, und wenn es der "einige zusätzliche Code" ist, wird das nicht-trivial sein. Das Problem ist, dass die Vorlage function_traits auf Funktionssignaturen und nicht auf tatsächlichen Funktionszeigern arbeitet. Daher hat sich das Problem von 'Holen Sie den Rückgabetyp von einem Funktionszeiger' zu 'Holen der Signatur von einem Funktionszeiger' geändert, was wahrscheinlich am schwierigsten ist Teil dort.

    
quelle
5

Es ist schwierig, weil Funktionsnamen Ausdruck und nicht Typen sind - Sie brauchen etwas wie gcc's typeof . Boosts TypeOf ist eine portable Lösung, die sehr nahe kommt .

Wenn der Code jedoch so organisiert werden kann, dass die Arbeit innerhalb einer Funktionsvorlage erfolgt, an die Foo oder Bar übergeben werden kann, gibt es eine direkte Antwort:

%Vor%     
James Hopkin 05.01.2010 12:17
quelle
4

Foo und Bar sind Funktionen, keine Funktionstypen, also müssen Sie ein bisschen mehr Arbeit machen.

Hier ist eine Lösung, die eine Kombination aus boost :: function_traits und BOOST_TYPEOF verwendet.

%Vor%

Bearbeiten:

  • Dies funktioniert für alle Funktionen bis zu 10, was für die meisten sinnvollen Anwendungen ausreichen sollte.
  • Diese Verwendung von BOOST_TYPEOF funktioniert auf Plattformen, die keinen systemeigenen Typ bieten, also ist es einigermaßen portierbar.
Joe Gauterin 05.01.2010 12:38
quelle
2

In C ++ 0x verwenden Sie decltype .

Eine Diskussion über die Probleme und den Versuch, eine Lösung für einen früheren C ++ - Standard zu erstellen, finden Sie hier:

Scott Myers "Herausforderung" (PDF) und Andrei Alexandrescu versucht, es zu lösen

    
peterchen 05.01.2010 12:48
quelle
1

Hier kommt die Template-Magie (kein Boost ist beteiligt):

%Vor%

Und kompilieren Sie es über

%Vor%     
Sergey K. 02.07.2012 13:25
quelle
0

Wie von Dribeas vorgeschlagen, ist hier die Lösung, zu der ich schließlich kam:

%Vor%

Dies ist nicht genau die Form, die ich mit meiner ursprünglichen Frage angestrebt habe, aber es ist nahe genug für mich.

    
pauldoo 05.01.2010 12:38
quelle
-1

Versuchen Sie etwas wie folgt:

%Vor%     
Nicht Verstehen 05.01.2010 12:15
quelle