GOOGLE ADS

jeudi 14 avril 2022

Comment puis-je déterminer le type de retour d'une fonction membre C++11

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 TestCBClassqui 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::asyncet 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_ofet 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

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...