当用作模板类型参数时,函数的typedef与使用裸函数类型之间必须存在差异.
即,考虑一下
#include <functional>
typedef std::function<void(int)> TF1;
typedef void(*FooFn)(int);
typedef std::function<FooFn> TF2;
int main() {
TF1 tf1;
TF2 tf2;
return 0;
}
我可以创建TF1而不是TF2(错误:聚合’TF2 tf2’具有不完整的类型,无法定义). (见ideone example.)
有没有办法使用函数的typedef(签名)作为模板类型参数;具体来说,作为std :: function的类型参数?
(没有C 11标签,因为我对非现代编译器上的boost :: function感兴趣.但如果语言以某种方式改变以启用此功能,那么C 11答案也会受到赞赏.)
解决方法:
std :: function对象可以存储包含函数指针的任何Callable对象(可以使用类型为FooFn的指针初始化tf1).
但模板参数的类型为R结果类型和Args参数.
template< class R, class... Args >
class function<R(Args...)>;
编辑:
以下示例将FooFn typedef从函数指针更改为函数类型.