Betrachten Sie den folgenden Code nehmen mit:Detect die maximale Anzahl von Argumenten eine Funktion kann Metaprogrammierung
template <class T, class F>
std::size_t maximum_number_of_arguments(F&& f) {
// Code here
}
ich eine Funktion möchte, die die maximale Anzahl von Argumenten des Typs finden T
, dass die abrufbaren f
nehmen .
Zum Beispiel für folgende Überlastung Satz:
void f(int, int); // f called with 2 ints compiles
void f(int, int, int); // f called with 3 ints compiles
void f(int, char, int, double); // f called with 4 ints compiles
void f(int, std::string, int, int, int); // f called with 5 ints does not compile
Als Ergebnis:
maximum_number_of_arguments<int>(f)
sollte 4
zurückzukehren.
Ich denke, der Weg, um eine begrenzte Anzahl von Parametern zu beheben, die eine Funktion (zum Beispiel 256) nehmen kann, und testen Sie alle Möglichkeiten, und verfolgen Sie die Aufrufe, die nicht kompilieren fehlschlägt. Wie macht man das mit Template/Contexpr Metaprogrammierung?
EDIT: Um die Kommentare auf der Tatsache zu beantworten, dass wir nicht eine Überlastung Satz an eine Funktion kann (mein Beispiel mit f
ist wahrscheinlich nicht die beste):
#include <iostream>
struct functor
{
void operator()(int) {std::cout << "int" << std::endl;}
void operator()(int, int) {std::cout << "int, int" << std::endl;}
void operator()(int, int, int) {std::cout << "int, int, int" << std::endl;}
};
template <class F>
void caller(F&& f)
{
std::forward<F>(f)(1);
std::forward<F>(f)(1, 2);
std::forward<F>(f)(1, 2, 3);
}
int main(int argc, char* argv[])
{
functor f;
caller(f);
return 0;
}
Wie lautet die Antwort für 'printf'? –
Oder 'Vorlage void foo (T ...)' –
Barry
"Ich möchte eine Funktion, die die maximale Anzahl von Argumenten des Typs finden kann ...." - warum? Was ist der Anwendungsfall? Nicht lustig, aber das riecht wie ein x-y-Problem. –