C++11 以std::function<void()> 做非类型模板的参数类型为什么会报错呢?

正在学习C++11的新特性,用非类型模板写了一个函数包装器,我是这样写的:
#include
#include
#include
#include
voidhello(){
std::cout<<"Hello,world!\n";
return;
}
templatei>
voidwrapper(){
i();
}
intmain(){
std::functionf=hello;
wrapper();
return0;
}
在VS2013上编译错误,提示是
“std::function”:非类型模板参数“i”的类型非法
但是当我将wrapper的定义改成
template
voidwrapper(){
i();
}
将调用改成wrapper();之后编译运行就一切正常了。请问这是什么原因?
另外请问std::function除了能包装匿名函数外,还有什么情况下与函数对象或者普通函数指针表现不同呢?谢谢。
鸿蒙传说
浏览 1372回答 2
2回答

LEATH

你的写法,template,这里的i明显是一个变量,而不是类型,如果要声明类型应该写成template。不过如果声明为类型,wrapper当然就没法工作了,因为i()就相当于实例化一个空的std::function对象,并没有做任何事情,最终当然就不能得到你想要的效果。一般来说,你应该这样实现wrapper才正常。templatevoidwrapper(Funcfunc){func();}std::function最大的功能是表达匿名函数,特别是[]里面捕捉了当前上下文变量的匿名函数,结合着std::shared_ptr一起用,会有一种动态语言的错觉。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript