2014-12-22 7 views
11

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

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 
}; 
+0

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

+0

@Cynic Ja, genau so funktioniert es. Ich habe die Antwort entsprechend bearbeitet. – Angew

+0

Ich brauche Syntax wie 'Vorlage void foo (F (int) intCallable) {...}':/ – jaskmar

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 FTypeReturnType(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.