加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的函数和函数指针

发布时间:2020-12-16 10:01:26 所属栏目:百科 来源:网络整理
导读:参考以下代码 #include iostreamusing std::cout;using std::endl;#include vectorusing std::vector;void function() { cout "Hello World" endl;}int main() { vectorvoid (*) () functions; functions.push_back(function); // (1) no error functions.pu
参考以下代码

#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;

PS.
如果您正在使用VC(visual stdio),您可以通过打印typeid(decltype(XXX)).name()轻松查看从decltype推导出的类型.与其他编译器不同,VC提供了类型的未修饰名称.非常方便的元编程调试.

编辑:正如@Daniel Jour评论的那样,解决方案decltype(& function)也可以工作,因为构造& f给出指向f的指针,这就是你需要的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读