关于c++11 std::function的模板参数 <_Res(_ArgTypes...)>
最近在看一些c++11的新特性,很多都是新的写法。。(看的很吃力。@_@) 看到std::function的定义的时候看到这样的写法
template
有谁知道 class function< Res( ArgTypes…)> , 类名后面的这个是什么规则。。 我知道< Res( ArgTypes…)> 好像是函数 调用签名。他是为了指名function代理的函数 的类型的。 但是在c++的那个规则里有说。可以这样写的? 查了好久没有查到这样的写法是从那里来的。
-
- 首先请描述清楚你的问题,你是想问class function< Res( ArgTypes…)> 中_Res(ArgTypes…)是什么规则么?
- 如果你想问的是1中所描述的问题的话,理解如下: _Res是某个function type的返回值类型, ArgTypes是可变模版参数包,而ArgTypes… 则是参数包扩展,且扩展后的类型与传入function函数参数的类型相匹配。
举个例子: 首先声明一个Function 主模版,注:该模版不需要定义 template
class Function; 便特化Function模版,其实现如下
template <typename Func, typename... ArgsTypes> class Function<Func(ArgsTypes...)> { private: using FuncType = Func(ArgsTypes...); FuncType* func_; public: Function(FuncType func) : func_{func} {} void operator() (ArgsTypes... args) { func_(args...); } };
该便特化,模仿std::function的部分功能。
定义一个print函数如下
void print(int a, int b, int c) { std::cout << "a: " << a << " b: " << b << " c: " << c << "\n"; }
测试代码如下
int main() { Function<void(int, int, int)> f = print; f(1, 2, 3); return 0; }
通过该例子可以明白Function
的功能,此时针对便特化版本的Function,Func被编译器推导为void, ArgsType…扩展的参数包为int, int, int。 故Func(ArgsType…)便是一个函数声明。
发表回复