C++如何同时展开多个参数包?含模板函数实例解析
C++多参数包展开与模板参数显式指定问题
先看你给出的测试代码:
#include <functional> template<typename... TS, size_t N> void f0( TS(&& ... args)[N] ) {} template<typename T, size_t... NS> void f1( T(&& ... args)[NS] ) {} template<typename... TS, size_t... NS> void f2( TS(&& ... args)[NS] ) {} int main(){ f0({1,2}, {3.0,4.0}, {true, false}); f1({1,2,3}, {4,5}, {6}); f2({1,2,3}, {4.0,5.0}, {true}); return 0; }
针对你的两个问题解答如下:
1. 单个展开符下展开多个参数包的通用规则
- 长度一致性要求:所有参与展开的参数包必须拥有完全相同的长度,这是展开的基础前提,否则编译器直接报错。
- 按位置配对绑定:C++标准明确规定,展开时会将多个参数包的第n个元素与函数参数列表的第n个位置一一配对。比如
TS(&& ... args)[NS]中,第一个args对应TS的第一个类型和NS的第一个尺寸,第二个args对应TS的第二个类型和NS的第二个尺寸,以此类推,每个函数参数位置会同时消耗所有参数包的对应位置元素。 - 类型兼容性要求:每个参数包的元素必须和函数参数的对应部分类型匹配。比如
TS的第n个类型要能适配对应数组的元素类型,NS的第n个尺寸必须等于对应数组的长度。
2. 显式指定模板参数的代码编译失败的原因
C++模板规则中,当存在多个变长参数包时,编译器无法自动拆分显式传入的模板参数列表。f2的模板参数是typename... TS, size_t... NS,两个都是变长参数包,你显式传入int,float,bool,3,2,1时,编译器没有明确依据判断哪些参数属于类型参数包TS、哪些属于非类型参数包NS——它无法确定是前3个给TS、后3个给NS,也无法排除其他拆分可能,因此直接触发编译错误。
内容的提问来源于stack exchange,提问作者Vladislav Ihost
相关产品推荐
相关产品推荐

