In C++ 11 können Sie std :: Funktion wie folgt instanziiert um Artikel zu finden, wie man std :: function-like template schreibt, die Klammern in Klammern akzeptiert. Könnte jemand bitte die Syntax und ihre Einschränkungen erklären oder zumindest auf eine bestehende Erklärung verweisen?C++ std :: function-like Template Syntax
11
A
Antwort
14
Es gibt nichts Besonderes, es ist ein gewöhnlicher Funktionstyp. Wenn Sie eine Funktion wie folgt erklären:
int foo(char a, double b)
Dann ist seine Art int (char, double)
. Eine Möglichkeit zum "Auspacken" der einzelnen Argumenttypen und des Rückgabetyps ist die Verwendung einer partiellen Vorlagenspezialisierung. Grundsätzlich sieht std::function
etwas wie folgt aus:
template <class T>
struct function; // not defined
template <class R, class... A>
struct function<R (A...)>
{
// definition here
};
3
Ziemlich viel wie jede andere Vorlage, da int(std::string, std::string)
nur ein Typ ist.
Hier ist ein wirklich naiv Beispiel, das kompiliert:
template <typename FType>
struct Functor
{
Functor(FType* fptr) : fptr(fptr) {}
template <typename ...Args>
void call(Args... args)
{
fptr(args...);
}
private:
FType* fptr;
};
void foo(int x, char y, bool z) {}
int main()
{
Functor<void(int, char, bool)> f(&foo);
f.call(1, 'a', true);
//f.call(); // error: too few arguments to function
}
In Wirklichkeit Sie eine Spezialisierung haben würden auf FType
ReturnType(ArgTypes...)
zu sein, obwohl mein naives Beispiel werden Ihnen bereits gibt die Validierung Sie benötigen, wenn Sie versuchen, es zu berufen in kompatiblen Weisen.
Also, wenn ich richtig verstehe, wird int (char, double) als einzelne Funktion Typ interpretiert, aber wir können dann Rückgabetyp und Parameterliste mit partieller Spezialisierung extrahieren? – Smiles
@Cynic Ja, genau so funktioniert es. Ich habe die Antwort entsprechend bearbeitet. – Angew
Ich brauche Syntax wie 'Vorlage void foo (F (int) intCallable) {...}':/ –
jaskmar