C++中的函数和函数指针

Functions and function pointers in C++

本文关键字:函数 指针 C++      更新时间:2023-10-16

参考以下代码

#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
void function() {
    cout << "Hello World" << endl;
}
int main() {
    vector<void (*) ()> functions;
    functions.push_back(function);         // (1) no error
    functions.push_back(&function);        // (2) no error
    for (const auto& func : functions) {
        func();
    }
    // vector<decltype(function)> vec;     // (3) error
    return 0;
}

当我取消评论(3)时似乎有一个错误,我只是想了解这背后的原因。 当我将函数作为参数传递给模板化函数时,它会将类型解析为函数指针吗?编译器将所有函数类型推导为函数指针是有意义的,但是为什么 decltype() 不解析为函数指针呢?

decltype(function)void() - 一个函数。
你需要的是一个函数的衰减版本 - void(*)()

std::decay<decltype(function)>::type
std::vector < std::decay<decltype(function)>::type > myPtrFunctionVec;

附言。
如果您正在使用 VC++(可视 stdio),则可以通过打印typeid(decltype(XXX)).name()轻松查看从decltype推断的类型。与其他编译器不同,VC++ 提供类型的未修饰名称。对于元编程调试非常方便。

编辑:
正如@Daniel Jour所评论的那样,该解决方案decltype(&function)有效,因为构造&f提供了指向f的指针,这正是您所需要的