C++11 以std::function<void()> 做非类型模板的参数类型为什么会报错呢?
迷茫
迷茫 2017-04-17 11:38:24
[C++讨论组]

正在学习C++11的新特性,用非类型模板写了一个函数包装器,我是这样写的:

#include 
#include 
#include 
#include 

void hello() {
    std::cout << "Hello, world!\n";
    return;
}

template< std::function i>
void wrapper() {
    i();
}

int main() {
    std::function f = hello;
    wrapper();
    return 0;
}

在VS2013上编译错误,提示是

“std::function”: 非类型模板参数“i”的类型非法

但是当我将wrapper的定义改成

template
void wrapper() {
    i();
}

将调用改成wrapper();之后编译运行就一切正常了。请问这是什么原因?
另外请问std::function除了能包装匿名函数外,还有什么情况下与函数对象或者普通函数指针表现不同呢?谢谢。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
伊谢尔伦

你的写法, template < std::function<void()> i >,这里的 i 明显是一个变量,而不是类型,如果要声明类型应该写成 template <typename Func>。不过如果声明为类型,wrapper 当然就没法工作了,因为 i() 就相当于实例化一个空的 std::function 对象,并没有做任何事情,最终当然就不能得到你想要的效果。

一般来说,你应该这样实现 wrapper 才正常。

template <typename Func>
void wrapper(Func func) {
    func();
}

std::function 最大的功能是表达匿名函数,特别是 [] 里面捕捉了当前上下文变量的匿名函数,结合着 std::shared_ptr 一起用,会有一种动态语言的错觉。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号