c – 如何使用函数签名的typedef作为std :: function的类型参数?

当用作模板类型参数时,函数的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从函数指针更改为函数类型.

https://ideone.com/XF9I7N

上一篇:c – 某些东西可以绑定到非const ref而不是const ref的情况?


下一篇:许可证加解密