C++20如何获取std::size_t类型参数包的最后一个元素?
获取std::size_t类型非类型参数包的最后一个元素
你提到的select_last模板仅适用于类型参数包,但std::size_t... N属于非类型参数包,直接套用自然会失效。以下是针对非类型参数包的解决方案:
方案1:递归模板特化(兼容C++11及以上)
通过递归匹配参数包,逐步缩小范围直到只剩最后一个元素:
// 基础模板:匹配包含至少一个元素的参数包 template<std::size_t First, std::size_t... Rest> struct select_last_non_type { static constexpr std::size_t value = select_last_non_type<Rest...>::value; }; // 特化版本:匹配仅含单个元素的参数包 template<std::size_t Last> struct select_last_non_type<Last> { static constexpr std::size_t value = Last; }; // 辅助变量模板,简化调用 template<std::size_t... N> constexpr std::size_t select_last_non_type_v = select_last_non_type<N...>::value;
使用示例:
template<std::size_t... N> class Example { private: using type = select_last<int, double>::type; // 原类型参数包逻辑正常工作 static constexpr std::size_t size_t_type = select_last_non_type_v<N...>; // 非类型参数包处理 };
方案2:折叠表达式(C++17及以上,更简洁)
利用C++17的折叠表达式,通过逗号运算符直接提取最后一个值:
template<std::size_t... N> struct select_last_non_type { static_assert(sizeof...(N) > 0, "参数包不能为空"); // 折叠表达式(..., N)会依次计算所有元素,最终结果为最后一个元素的值 static constexpr std::size_t value = (..., N); }; template<std::size_t... N> constexpr std::size_t select_last_non_type_v = select_last_non_type<N...>::value;
原代码失效原因
原select_last模板的参数是typename... Ts,要求传入类型,但std::size_t... N是值参数包,并非类型。你写的select_last<size_t... N>属于语法错误——值参数包不能直接作为类型参数传入模板。
内容的提问来源于stack exchange,提问作者Cedric Martens
相关产品推荐
相关产品推荐

