J'essaie de déterminer le type de retour de diverses fonctions membres C++. Je comprends que decltype et std:: declval peuvent être utilisés pour cela, mais j'ai des problèmes avec la syntaxe et je trouve des exemples utiles. Ce TestCBClass
qui suit montre un exemple d'une classe stupide qui contient un mélange de fonctions membres statiques et normales - avec & sans arguments et types de retour. Selon la méthode en question, j'aimerais pouvoir déclarer un vecteur de types de retour à partir de chacune des différentes méthodes.
Dans mon application, ces méthodes sont des rappels pour std::async
et j'ai besoin d'un vecteur de std::future<return types>
. J'ai essayé diverses déclarations telles que decltype(std::declval(TestCBClass::testStaticMethod))
(je ne sais pas si j'ai besoin d'un &
avant le nom de la méthode). Cette syntaxe est incorrecte - et bien sûr elle ne compile pas, mais je pense que c'est l'approche qui devrait être utilisée.
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;
};
Solution du problème
Vous pouvez également utiliser std::result_of
et decltype
, si vous préférez répertorier les types d'arguments plutôt que les valeurs factices correspondantes, comme ceci :
#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;
}
DÉMO ici.
Aucun commentaire:
Enregistrer un commentaire