2015-10-01 21 views
5

Voglio ottenere il tipo di una funzione e creare un std::vector di esso. Ad esempio, hoOttieni decltype of function

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

e un vettore di funzioni di questo tipo sarebbe:

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

E, in generale, un decltype() sarebbe meglio, come:

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

tuttavia, ciò comporterà un errore di compilazione.

Credo che il motivo è che decltype() non può distinguere tra

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

C'è un modo per risolvere questo problema?

risposta

12

utilizzare:

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

o:

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

o:

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

Tuttavia, questo non riuscirà una volta foo è sovraccarico.

6

Per espandere il answer da Piotr Skotnicki

decltype(foo) 

ha il tipo di

int(int[], int) 

Il che non è un puntatore a funzione. Al fine di ottenere un puntatore a funzione hai utilizzare decltype con l'indirizzo della foodecltype(&foo) oppure è possibile aggiungere un * alla fine del tipo per dichiarare un puntatore al tipo di foodecltype(foo)*

0

La soluzione è come questo :

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

ed è ok