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

时间:2018-01-31 00:10:03

标签: c++ templates signature

当用作模板类型参数时,函数的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(错误:aggregate 'TF2 tf2' has incomplete type and cannot be defined)。 (见ideone example。)

有没有办法使用函数的typedef(签名)作为模板类型参数;具体来说,作为std::function的类型参数?

(没有C ++ 11标签,因为我对boost::function以及非现代编译器感兴趣。但如果语言以某种方式改变,那么C ++ 11的答案也会受到赞赏启用此功能。)

2 个答案:

答案 0 :(得分:3)

std::function对象可以存储包含函数指针的任何 Callable 对象(您可以使用类型为tf1的指针初始化FooFn

但模板参数的类型为R结果类型和Args参数。

template< class R, class... Args >
class function<R(Args...)>;

编辑: 以下示例将FooFn typedef从函数指针更改为函数类型。

https://ideone.com/XF9I7N

答案 1 :(得分:3)

std::function需要函数类型,而FooFn是指针(函数)类型,而不是函数类型。使用元编程辅助模板remove_pointer进行转换:

typedef std::function<std::remove_pointer<FooFn>::type> TF2;