编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异
题目挺绕口的。C++ 11的好东西不算太多,但变参模板(Variadic Template)肯定是其中耀眼的一颗明星,在C++设计新思维中,你可以看到很多模版的代码为了支持不确定的参数个数,而要重载1个参数到N个模板参数的N个函数。虽然种代码一般也是用会用宏和脚步辅助生成。但我想也没有人愿意看到几千行这种单调的函数。通过这个东东,模板的威力可以爆发。
目前的最新的编译器基本都已经支持Variadic Template了,GCC 4.6和Visual studio 2013都已经支持变参模板。但今天我在写一个Lua粘结层的时候发现了一个有意思的问题。
先上代码。
1 #include <iostream>
2
3
4 template <typename ... T>
5 void dummy_wrapper(T... t)
6 {
7 };
8
9 template <class T>
10 T unpacker(const T t)
11 {
12 std::cout << '[' << t << ']';
13 return t;
14 }
15
16
17 template <typename... Args>
18 void write_line(const Args& ... data)
19 {
20 dummy_wrapper(unpacker(data)...);
21 std::cout << '\n';
22 }
23
24 int main()
25 {
26 write_line(1, "--", "2.2.2", "--", 3.0);
27 return 0;
28 }
稍作解释,write_line是一个接受变参的模版