如何获取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
相关产品推荐
相关产品推荐

