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?
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.
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:
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:
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
Tags und Links c++ c++11 templates metaprogramming