C++元编程问题:为何Typelist转std::array列表仅首个类型生效?
解决Typelist批量转换类型时仅首个元素生效的问题
你遇到的核心问题是递归处理Typelist时未正确遍历所有元素,大概率是递归模板的参数传递错误,只重复处理了第一个元素,而非依次处理剩余类型。
常见错误示例及问题分析
比如你可能写出了类似下面的错误代码:
#include <array> template<typename... Ts> struct Typelist {}; template<typename List> struct TransformToArray; // 错误特化:递归时未处理剩余类型 template<typename T, typename... Ts> struct TransformToArray<Typelist<T, Ts...>> { // 错误:递归传入的是Typelist<T>而非Typelist<Ts...>,导致后续元素复用第一个元素的转换结果 using type = Typelist<std::array<T, 10>, typename TransformToArray<Typelist<T>>::type>; }; template<> struct TransformToArray<Typelist<>> { using type = Typelist<>; };
这里的问题很明确:递归步骤没有把剩余的Ts...组成的Typelist传入转换模板,反而重复传入了只包含第一个元素T的Typelist,最终所有尾部元素都会被替换成第一个元素的转换结果。
正确实现方式
方式1:递归模板(兼容C++11及以上)
#include <array> template<typename... Ts> struct Typelist {}; // 主模板 template<typename List, std::size_t N> struct TransformToArray; // 特化处理非空Typelist:遍历每个元素并转换 template<typename T, typename... Ts, std::size_t N> struct TransformToArray<Typelist<T, Ts...>, N> { // 转换当前元素T,同时递归处理剩余的Ts...组成的Typelist using type = Typelist<std::array<T, N>, typename TransformToArray<Typelist<Ts...>, N>::type>; }; // 终止条件:空Typelist返回空 template<std::size_t N> struct TransformToArray<Typelist<>, N> { using type = Typelist<>; }; // 测试验证 using OriginalList = Typelist<long, float, char>; using TransformedList = typename TransformToArray<OriginalList, 10>::type; // TransformedList 即为 Typelist<std::array<long,10>, std::array<float,10>, std::array<char,10>>
方式2:C++17折叠表达式(更简洁)
如果你的编译器支持C++17,可以直接用折叠表达式展开所有类型,无需递归:
#include <array> template<typename... Ts> struct Typelist {}; template<typename List, std::size_t N> struct TransformToArray; template<typename... Ts, std::size_t N> struct TransformToArray<Typelist<Ts...>, N> { // 直接展开所有Ts,每个都转换为std::array<Ts, N> using type = Typelist<std::array<Ts, N>...>; };
内容的提问来源于stack exchange,提问作者NICK
相关产品推荐
相关产品推荐

