如何将模板函数可变参数打包为数组?代码异常排查
问题:可变参数打包为数组返回时仅最后一个元素正确,其余为0?
我想把同类型的函数可变参数打包成数组并返回,于是编写了如下模板函数,但运行后发现数组只有最后一个元素正确,其余都是0:
template<typename... T> inline auto CreateArray(const T... t) { constexpr int ELEMENT_COUNT = TotalElementCount(t...); return std::array<int, ELEMENT_COUNT>{ (t, ...) }; }
调用示例:
auto new_array = CreateArray(1, 2, 3, 4); for (auto x : new_array) std::cout << std::dec << x << std::endl;
输出结果:
4 0 0 0
请问我的代码哪里出错了?
问题原因与修正方案
错误原因
问题出在折叠表达式 (t, ...) 上:C++的逗号运算符会依次计算每个操作数,但最终只返回最后一个操作数的值。(t, ...)展开后等价于(1, 2, 3, 4),整个表达式的结果是4。这意味着你给std::array的初始化列表里只提供了一个元素4,数组中剩余的元素会被值初始化(int类型默认初始化为0),这就是为什么输出只有第一个元素是4,其余都是0。
另外,计算参数个数的TotalElementCount可以直接用C++标准的sizeof...(T)替代,它能直接获取模板参数包的大小,无需额外函数。
修正后的代码
template<typename... T> inline auto CreateArray(const T... t) { constexpr int ELEMENT_COUNT = sizeof...(T); // 直接展开参数包到初始化列表中 return std::array<int, ELEMENT_COUNT>{t...}; }
可选增强:类型检查
如果需要确保所有参数都是int类型(或可安全转换为int),可以添加静态断言增强类型安全性:
template<typename... T> inline auto CreateArray(const T... t) { static_assert((std::is_same_v<T, int> && ...), "所有参数必须为int类型"); constexpr int ELEMENT_COUNT = sizeof...(T); return std::array<int, ELEMENT_COUNT>{t...}; }
内容的提问来源于stack exchange,提问作者user19179144
相关产品推荐
相关产品推荐

