2015-10-01 9 views
5

Ich möchte den Typ einer Funktion und erstellen Sie eine std::vector davon. Zum Beispiel, ich habeGet declltype der Funktion

int foo(int a[], int n) { return 1; } 
int bar(int a[], int n) { return 2; } 

und ein Vektor von Funktionen wie das wäre:

std::vector< std::function<int(int[],int)> > v; 

Und in der Regel ein decltype() wäre besser, wie:

std::vector< decltype(foo) > v; 

jedoch Dies wird zu einem Kompilierungsfehler führen.

ich der Grund Vermutung ist, dass decltype() nicht zwischen

int (*func)(int[], int) 
std::function<int(int[], int)> 

Gibt es eine Möglichkeit, dies zu beheben unterscheiden können? entweder

Antwort

12

Verwendung:

std::vector< decltype(&foo) > v; 

oder:

std::vector< decltype(foo)* > v; 

oder:

std::vector< std::function<decltype(foo)> > v; 

Dies wird jedoch nicht einmal foo überlastet ist.

6

Zur Erweiterung auf dem answer von Piotr Skotnicki

decltype(foo) 

Hat die Art der

int(int[], int) 

, die keine Funktionszeiger ist. Um einen Funktionszeiger zu erhalten müssen Sie entweder decltype mit der Adresse des foodecltype(&foo) verwenden, oder Sie können eine * bis zum Ende des Typs hinzufügen, einen Zeiger auf den Typ des foodecltype(foo)*

0

Die Lösung wie folgt zu erklären ist :

typedef std::function<int(int[], int)> sf; 
std::vector<sf> v2; 

und es ist ok

Verwandte Themen