C ++ Lambda hat keinen operator ()

Ich brauche eine Methode, um die Argumenttypen einer Funktion herauszufinden. Deshalb habe ich eine Closure_traits-Klasse geschrieben, die unten angegeben ist und von @ inspiriert isIst es möglich, den Parametertyp und den Rückgabetyp eines Lambda herauszufinden?.

Wenn ich jedoch versuche, es auf ein einfaches Lambda anzuwenden, erhalte ich die Fehlermeldung, dass 'operator ()' kein Mitglied von '(lambda type)' ist. Laut cppreference haben Lambdas jedoch einen Operator (). Ich habe auch versucht, std :: function zu verwenden, und habe den entsprechenden Fehler erhalten. Ich glaube, ich bin mir nicht sicher, was los ist, und jede Hilfe wäre sehr dankbar.

#include<type_traits> 
#include<tuple>                                                                           
#include<utility> 
#include<iostream>                                                                                                     

/* For generic types use the type signature of their operator() */                                                     
template <typename T>                                                                                      
struct closure_traits : public
                        closure_traits<decltype(&T::operator())> {};                                        

/* Otherwise, we do a template match on a function type. */
template <typename ClassType, typename ReturnType, 
          typename... ArgTypes>                                                  
struct closure_traits<ReturnType (ClassType::*) (ArgTypes... args)>                                                  
{
    using arity = std::integral_constant<std::size_t,
                                         sizeof...(ArgTypes)>;                                              
    using Ret = ReturnType;                                  

    /* The argument types will be the same as the types of the 
     * elements of a tuple composed of them. 
     */                                                                                             
    template <std::size_t I>       
    struct Args {        
        using type = typename std::tuple_element<I, 
                                       std::tuple<ArgTypes...>>::type;                                                                                                                     
    };                                                                                                                                                                                                                                        

};                                                                                                                                                                                                                                                

int main() {                                                                                                                     
    auto thing = [=] (int x) {return x;}; 

    std::cerr << "The number of arguments is " 
              << closure_traits<decltype(thing)>::arity << std::endl;                                                                                                                     

    return 0;                                                                                                                       
}    

Die Compiler-Fehlermeldungen, die ich erhalte, sind unten. Mein Kompilierbefehl lautet einfach g ++ -std = c ++ 14 main.cpp.

main.cpp: In instantiation of ‘struct closure_traits<int (main()::<lambda(int)>::*)(int) const>’:
main.cpp:9:8:   required from ‘struct closure_traits<main()::<lambda(int)> >’
main.cpp:34:82:   required from here
main.cpp:9:56: error: ‘operator()’ is not a member of ‘int (main()::<lambda(int)>::*)(int) const’
 struct closure_traits : public closure_traits<decltype(&T::operator())> {};                                        
                                                    ^
main.cpp: In function ‘int main()’:
main.cpp:34:51: error: ‘arity’ is not a member of ‘closure_traits<main()::<lambda(int)> >’
 std::cerr << "The number of arguments is " << closure_traits<decltype(thing)>::arity << std::endl; 

Antworten auf die Frage(6)

Ihre Antwort auf die Frage