Godot Source Code Note 4
模板参数展开
可变参数模板分为类型模板形参包与函数形参包。
先上一段Godot源码:
可以看到,代码中使用了一种初始化列表展开的方法,本文简要介绍几种类似方法。
C++11之前:
> 递归模板函数
此方法必须要定义一个递归终止函数,很不简洁。
递归函数调用容易引起栈溢出。
C++11:
> 初始化列表展开
这里借助了逗号表达式的特性,括号中用逗号分隔的表达式会以从左往右的顺序执行,最后返回最右边表达式的结果。在(std::cout << args << std::endl, 0)...包展开中,逗号左边的输出语句先被执行,然后逗号右边的0返回作为数组的元素。因此,如果sizeof...(args)为3的话,那么temp数组为{0, 0, 0}。
上面展示的Godot源代码即使用了此方法。
C++17:
> 折叠表达式
相当简洁,但要掌握集中折叠规则。
容易出错。
> constexpr if 编译时条件判断
constexpr if语句使得模板函数在编译期就可以完成条件判断,而不是运行时。
constexpr if语句起到了一个类似条件编译的效果。
挖个坑,以后有机会可以谈谈constexpr。
部分参考《现代C++语言核心特性解析》《现代C++教程》
如侵删。
欢迎评论指正。