You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:05:37