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

如何获取template template argument所接受的模板参数数量?

问题描述

我定义了一个接受模板模板参数的结构体,代码如下:

template <template <typename...Args> typename T>
struct foo {
    static size_t get_count() {
        // ... 此处实现
    }
};

我希望在foo内部统计T所接受的模板参数数量,使得以下调用分别返回1和2:

template <typename T>
struct bar1{};
template <typename T, typename S>
struct bar2{};

foo<bar1>::get_count(); // = 1
foo<bar2>::get_count(); // = 2

我尝试过使用sizeof...(Args),但无法生效,因为Args...并非foo的实际模板参数。请问是否可以实现该需求?

解决方案

可以实现该需求,核心是通过辅助模板特化推导模板模板参数的参数个数,具体实现如下:

方法一:基于模板特化的Traits

首先定义一个辅助Traits模板,用来提取模板模板参数的参数数量:

#include <type_traits>

// 基础模板声明
template <template <typename...> typename T, typename... Args>
struct template_arg_count_helper;

// 特化版本,推导模板参数包大小
template <template <typename...> typename T, typename... Args>
struct template_arg_count_helper<T, std::type_identity_t<Args>...> {
    static constexpr size_t value = sizeof...(Args);
};

然后修改foo结构体,在get_count中调用该Traits:

template <template <typename...Args> typename T>
struct foo {
    static size_t get_count() {
        return template_arg_count_helper<T>::value;
    }
};

方法二:C++20简化写法

如果使用C++20及以上标准,可借助std::type_identity和函数重载简化实现:

#include <type_traits>

template <template <typename...> typename T>
struct template_arg_count {
    // 重载函数,用于推导参数包大小
    template <typename... Args>
    static constexpr size_t count(T<Args...>) noexcept {
        return sizeof...(Args);
    }

    // 利用类型占位符触发推导
    static constexpr size_t value = count(T<std::type_identity_t<int>...>);
};

template <template <typename...Args> typename T>
struct foo {
    static size_t get_count() {
        return template_arg_count<T>::value;
    }
};

两种实现都能满足需求:foo<bar1>::get_count()返回1,foo<bar2>::get_count()返回2。

内容的提问来源于stack exchange,提问作者Ajay Brahmakshatriya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:39:23