获取功能的decltype

时间:2015-10-01 12:46:46

标签: c++ decltype

我想获取一个函数的类型并创建一个std::vector。例如,我有

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

和这样的函数向量是:

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

一般而言,decltype()会更好,例如:

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

但是,这将导致编译错误。

我猜原因是decltype()无法区分

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

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:15)

使用:

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

或:

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

或:

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

但是,一旦foo超载,上述所有解决方案都将失败。另请注意,std::function是一种类型橡皮擦,它以虚拟呼叫为代价。

中,您可以让std::vector从初始化列表中推断出类模板参数:

std::vector v{ foo, bar };

答案 1 :(得分:9)

通过answer

扩展Piotr Skotnicki
decltype(foo)

的类型是

int(int[], int)

哪个不是函数指针。要获取函数指针,您必须使用地址为decltype foo的{​​{1}},或者您可以在类型的末尾添加decltype(&foo)来声明指向* foo

类型的指针

答案 2 :(得分:1)

解决方案是这样的:

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

没关系