C++参数包大小及特定类型参数数量推导问题求助
解决C++函数参数包大小及特定类型数量的自动推导问题
一、基础问题:参数包大小N的推导失败原因
你之前的代码无法推导N,是因为模板参数N是独立的非类型参数,编译器找不到它和函数参数包Ts...的关联关系,无法自动推导其值。要让N自动等于参数包的大小,需要将N的默认值绑定到sizeof...(Ts)上。
修正后的基础版本
#include <array> #include <type_traits> template<typename... Ts, int N = sizeof...(Ts)> std::array<int, N> foo(Ts... ts) { std::array<int, N> out; // 可根据需求初始化数组,比如: int idx = 0; ((out[idx++] = static_cast<int>(ts)), ...); return out; } int main() { // 自动推导N=5,返回std::array<int,5> auto a = foo(1, 2, 3, '4', 5); return 0; }
这里调整了模板参数顺序:先推导Ts...,再用sizeof...(Ts)作为N的默认值,编译器就能自动确定N的大小。
二、进阶需求:推导特定类型(如int)的参数数量N_ints
要统计参数包中int类型的个数,可借助折叠表达式和std::is_same_v实现,同样将N_ints设为依赖于Ts...的默认模板参数:
完整实现代码
#include <array> #include <type_traits> // 辅助工具:计算参数包中指定类型的数量 template<typename Target, typename... Ts> constexpr int count_target_type() { // 折叠表达式:逐个判断类型是否匹配,累加计数 return (0 + ... + (std::is_same_v<Target, Ts> ? 1 : 0)); } template<typename... Ts, int N = sizeof...(Ts), int N_ints = count_target_type<int, Ts...>()> void foo(Ts... ts) { // 验证推导结果是否正确 static_assert(N == 3, "参数包大小推导错误"); static_assert(N_ints == 2, "int类型数量推导错误"); // 业务逻辑示例:打印推导结果 printf("参数包总大小:%d\n", N); printf("int类型参数数量:%d\n", N_ints); } int main() { // 自动推导N=3,N_ints=2,无需显式指定模板参数 foo(1, 2, '3'); return 0; }
代码说明
count_target_type是一个constexpr函数,利用C++17的折叠表达式遍历参数包,统计与Target类型匹配的参数个数。- 模板参数
N和N_ints都通过默认值绑定到参数包的属性上:N直接取sizeof...(Ts),即参数包的总个数;N_ints调用count_target_type<int, Ts...>(),得到int类型参数的数量。
- 调用
foo(1,2,'3')时,编译器先推导Ts...为<int, int, char>,再自动计算出N=3、N_ints=2,完全符合你的需求。
三、替代方案:用auto推导返回值(简化基础场景)
如果只是需要返回对应大小的std::array,甚至可以省略N模板参数,直接用auto推导返回值:
#include <array> template<typename... Ts> auto foo(Ts... ts) { std::array<int, sizeof...(Ts)> out; int idx = 0; ((out[idx++] = static_cast<int>(ts)), ...); return out; }
这种写法更简洁,编译器会自动推导返回的std::array大小。
内容的提问来源于stack exchange,提问作者user20353409
相关产品推荐
相关产品推荐

