首页 > 解决方案 > 使用模板模板函数获取模板参数的数量

问题描述

我不确定这是否可能,但我想计算任何类的模板参数的数量,例如:

template <typename T>
class MyTemplateClass { ... };

template <typename T, typename U>
class MyTemplateClass2 { ... };

这样template_size<MyTemplateClass>() == 1template_size<MyTemplateClass2>() == 2。我是模板模板的初学者,所以我想出了这个当然不起作用的功能:

template <template <typename... Ts> class T>
constexpr size_t template_size() {
     return sizeof...(Ts);
}

因为Ts不能引用。我也知道在处理变体模板时可能会出现问题,但事实并非如此,至少对于我的应用程序而言。

提前谢谢

标签: c++c++11template-templates

解决方案


#include <utility>
#include <iostream>

template<template<class...>class>
struct ztag_t {};
    
template <template<class>class T>
constexpr std::size_t template_size_helper(ztag_t<T>) {
     return 1;
}
template <template<class, class>class T>
constexpr std::size_t template_size_helper(ztag_t<T>) {
     return 2;
}


template <typename T>
class MyTemplateClass {  };

template <typename T, typename U>
class MyTemplateClass2 {  };

template<template<class...>class T>
struct template_size:
  std::integral_constant<
    std::size_t,
    template_size_helper(ztag_t<T>{})
  >
{};


int main() {
    std::cout << template_size<MyTemplateClass>::value << "\n";
    std::cout << template_size<MyTemplateClass2>::value << "\n";
}

如果不写出 N 个重载来支持最多 N 个参数,我就没有办法。

活生生的例子

当然,反思会使这变得微不足道。


推荐阅读