获取功能的decltype

Q. *_*ang 8 c++ decltype

我想得到一个函数的类型并创建std::vector它.例如,我有

int foo(int a[], int n) { return 1; }
int bar(int a[], int n) { return 2; }
Run Code Online (Sandbox Code Playgroud)

和这样的函数的向量将是:

std::vector< std::function<int(int[],int)> > v;
Run Code Online (Sandbox Code Playgroud)

总的来说,一个decltype()会更好,比如:

std::vector< decltype(foo) > v;
Run Code Online (Sandbox Code Playgroud)

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

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

int (*func)(int[], int)
std::function<int(int[], int)>
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*cki 15

使用:

std::vector< decltype(&foo) > v;
Run Code Online (Sandbox Code Playgroud)

要么:

std::vector< decltype(foo)* > v;
Run Code Online (Sandbox Code Playgroud)

要么:

std::vector< std::function<decltype(foo)> > v;
Run Code Online (Sandbox Code Playgroud)

但是,一旦foo过载,所有上述解决方案都将失败.另请注意,这std::function是一种以橡皮擦为代价的类型橡皮擦.

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

std::vector v{ foo, bar };
Run Code Online (Sandbox Code Playgroud)


Nat*_*ica 10

为了扩大对答案彼得·Skotnicki

decltype(foo)
Run Code Online (Sandbox Code Playgroud)

有类型的

int(int[], int)
Run Code Online (Sandbox Code Playgroud)

哪个不是函数指针.为了获得一个函数指针,您必须使用decltype地址foo decltype(&foo)或者您可以*在类型的末尾添加一个声明指向类型的指针foo decltype(foo)*