Ich versuche, den Rückgabetyp verschiedener C++-Memberfunktionen zu bestimmen. Ich verstehe, dass decltype und std::declval dazu verwendet werden können, aber ich habe Probleme mit der Syntax und finde nützliche Beispiele. Das TestCBClass
Folgende zeigt ein Beispiel einer dummen Klasse, die eine Mischung aus statischen und normalen Elementfunktionen enthält - mit und ohne Argumente und Rückgabetypen. Abhängig von der betreffenden Methode möchte ich in der Lage sein, einen Vektor von Rückgabetypen von jeder der verschiedenen Methoden zu deklarieren.
In meiner Anwendung sind diese Methoden Rückrufe für std::async
und ich brauche einen Vektor von std::future<return types>
. Ich habe verschiedene Deklarationen ausprobiert, z. B. decltype(std::declval(TestCBClass::testStaticMethod))
(ich bin mir nicht sicher, ob ich &
vor dem Methodennamen eine brauche). Diese Syntax ist falsch - und wird natürlich nicht kompiliert, aber ich denke, es ist der Ansatz, der verwendet werden sollte.
class TestCBClass {
public:
TestCBClass(const int& rValue = 1)
: mValue(rValue) {
std::cout << "~TestCBClass()" << std::endl;
}
virtual ~TestCBClass() {
std::cout << "~TestCBClass()" << std::endl;
}
void testCBEmpty(void) {
std::cout << "testCBEmpty()" << std::endl;
}
int testCBArgRet(const int& rArg) {
std::cout << "testCBArgRet(" << rArg << ")" << std::endl;
mValue = rArg;
}
static void testCBEmptyStatic(void) {
std::cout << "testCBEmptyStatic()" << std::endl;
}
static void cbArgRetStatic(const SLDBConfigParams& rParams) {
std::lock_guard<std::mutex> lock(gMutexGuard);
std::cout << rParams.mPriority << std::endl;
}
static std::string testStaticMethod(const PriorityLevel& rPrty) {
return "this is a silly return string";
}
private:
int mValue;
};
Lösung des Problems
Sie können auch std::result_of
und verwenden decltype
, wenn Sie es vorziehen, Argumenttypen anstelle der entsprechenden Dummy-Werte aufzulisten, wie folgt:
#include <iostream>
#include <utility>
#include <type_traits>
struct foo {
int memfun1(int a) const { return a; }
double memfun2(double b) const { return b; }
};
int main() {
std::result_of<decltype(&foo::memfun1)(foo, int)>::type i = 10;
std::cout << i << std::endl;
std::result_of<decltype(&foo::memfun2)(foo, double)>::type d = 12.9;
std::cout << d << std::endl;
}
DEMO hier.
Keine Kommentare:
Kommentar veröffentlichen