GOOGLE ADS

Montag, 2. Mai 2022

Wie kann ich den Rückgabetyp einer C++ 11-Mitgliedsfunktion bestimmen

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 TestCBClassFolgende 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::asyncund 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_ofund 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...