2015-10-01 13 views
5

Chcę uzyskać typ funkcji i utworzyć jej std::vector. Na przykład, mamUzyskaj typ funkcji

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

i wektorem funkcji jak to będzie:

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

A w ogóle, decltype() byłoby lepiej, jak:

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

jednak spowoduje to błąd kompilacji.

Myślę, że powodem jest to, że decltype() nie potrafią odróżnić

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

Czy istnieje sposób aby to naprawić?

Odpowiedz

12

Zastosowanie albo:

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

czyli

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

czyli

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

Będzie to jednak nie raz foo jest przeciążony.

6

Aby rozwinąć na answer przez Piotr Skotnicki

decltype(foo) 

Posiada typ

int(int[], int) 

który nie jest wskaźnik funkcji. W celu uzyskania wskaźnik funkcji albo trzeba użyć decltype z adresem foodecltype(&foo) lub można dodać * do końca typu zadeklarować wskaźnik do typu foodecltype(foo)*

0

Rozwiązaniem jest tak :

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

i jest ok