编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异

本文探讨了C++ 11中变参模板(Variadic Template)的函数包扩展在不同编译器(如Visual C++ 2013和GCC 4.8)中的实现差异,导致输出结果出现反转的现象。问题源于编译器参数入栈顺序的不确定性。作者提出使用递归包扩展的方式来规避此问题,但指出在涉及函数指针的情况下,该方法并不适用。文章最后建议等待编译器更新或采取临时的反向传递参数的方法来应对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译器对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是一个接受变参的模版

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值