Come posso ottenere l'arità di un tipo di funzione arbitrario utilizzato come parametro di modello?Ottieni la funzione dal parametro modello
La funzione può essere una funzione normale, una lambda o un funtore. Esempio:
template<typename TFunc>
std::size_t getArity()
{
// ...?
}
template<typename TFunc>
void printArity(TFunc mFunc)
{
std::cout << "arity: " << getArity<TFunc>() << std::endl;
}
void testFunc(int) { }
int main()
{
printArity([](){}); // prints 0
printArity([&](int x, float y){}); // prints 2
printArity(testFunc); // prints 1
}
Ho accesso a tutte le funzionalità di C++ 14.
Devo creare la specializzazione per ogni tipo di funzione (e tutti i rispettivi qualificatori)? O c'è un modo più semplice?
Qual è la tua definizione di origine di un lambda generico variadico? O di un funtore con 'operatore()' s sovraccaricato che prende un numero diverso di parametri? –
possibile duplicato di [È possibile capire il tipo di parametro e il tipo di ritorno di un lambda?] (Http://stackoverflow.com/questions/7943525/is-it-possible-to-figure-out-the-parameter -type-and-return-type-of-a-lambda) – Barry
Hai solo bisogno di due overload: uno per i puntatori di funzione (facile, basta usare 'sizeof ... 'sul pacchetto argomento dedotto) e uno per lambdas e altre classi (prendi 'decltype' del suo' operator() 'e poi fai la stessa cosa). Se 'operator()' è sovraccarico, sei sfortunato. – Brian