C++ 11 新特性之 template

前 7 篇在这里:

这是C++11新特性介绍的第八部分,涉及到template相关的新特性。
不想看toy code的读者可以直接拉到文章最后看这部分的总结。

function

C++提供了很多种可调用对象,例如函数指针、lambda、重载了operator()的对象等。有时我们需要将这些对象统一管理,这时使用如下这种方式是不行的:

无法直接将binops中的可调用对象直接转换成int(*)(int, int)。

C++11新标准中提供了一个名为function的标准库类,可以用function来表示以上所有的函数调用,只要这些函数调用的参数类型和返回类型是一致的。

模板友元

在新标准中,可以声明一个类的模板参数类型为类的友元。

可以看到,由于友元机制,在Foo中可以直接访问到Bar的protected属性。

模板别名

新标准中,可以使用using为模板声明别名。

可以看到,在声明str_int的时候,还可以用某一类型部分实例化模板。这是一个挺好用的特性。

默认参数

新标准中,可以像为函数提供默认参数一样,为模板参数提供默认值。

尾置返回类型

当时用模板定义一个函数时,有时函数的返回类型是和模板参数相关的,这时可以通过decltype获得返回类型。

但是这样写是无法通过编译的,因为decltype进行类型推断时,beg还不存在。所以这时需要使用尾置返回类型。

不定长模板

新标准中,可以定义一个不定长度的模板参数列表。这种形式,一般和递归结合使用。

第一次为print_variadic传入了4个需要打印的对象,则实例化第二个不定长模板函数,将100赋值给t,并将剩余的3个参数打包成rest。

在内部递归中,将不断的将rest包中的第一个参数拿出来付给t,剩余参数打包进行下一次递归调用。

最后只剩一个参数时,两种形式的print_variadic都可以匹配,但是第一种没有模版参数包的版本更加特例化,因此将调用第一种形式的print_variadic,结束递归。

总结

  1. 提供了一个名为function的标准库类,可以用function来表示多个不同形式的函数调用,只要这些函数调用的参数类型和返回类型是一致的
  2. 在新标准中,可以声明一个类的模板参数类型为类的友元。
  3. 新标准中,可以使用using为模板声明别名。
  4. 新标准中,可以像为函数提供默认参数一样,为模板参数提供默认值。
  5. 部分模板函数返回值需要使用尾置返回类型。
  6. 新标准中,可以定义一个不定长度的模板参数列表,将参数打包。这种形式,一般和递归结合使用。

完整代码详见template.cpp

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 4 收藏 评论

关于作者:usher2007

游戏开发 C/C++ Python Linux 个人主页 · 我的文章 · 9 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部