我想获取一个函数的类型并创建一个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)>
有没有办法解决这个问题?
答案 0 :(得分:15)
使用:
std::vector< decltype(&foo) > v;
或:
std::vector< decltype(foo)* > v;
或:
std::vector< std::function<decltype(foo)> > v;
但是,一旦foo
超载,上述所有解决方案都将失败。另请注意,std::function
是一种类型橡皮擦,它以虚拟呼叫为代价。
在c++17中,您可以让std::vector
从初始化列表中推断出类模板参数:
std::vector v{ foo, bar };
答案 1 :(得分:9)
通过answer
扩展Piotr Skotnickidecltype(foo)
的类型是
int(int[], int)
哪个不是函数指针。要获取函数指针,您必须使用地址为decltype
foo
的{{1}},或者您可以在类型的末尾添加decltype(&foo)
来声明指向*
foo
答案 2 :(得分:1)
解决方案是这样的:
typedef std::function<int(int[], int)> sf;
std::vector< sf > v2;
没关系