知道声明中模板形参的数量

Knowing the number of template parameters in the declaration

本文关键字:形参 声明      更新时间:2023-10-16

如果我有,

template<typename T1, typename T2, int N>
class X {};

我是否有办法知道class X有3个template参数?

用例简要:有两个库类ptr<T>(普通指针)和ptr_arr<T,N>(指向数组的指针)。这两个类以以下方式与另一个类交互:

template<typename T>
void Clear(const T &obj)
{
  if(T::Args == 1) destroy(obj);
  else destroy_arr(obj);
}

所以,我想如果我们有一些方便的方法来知道参数的数量,这将使它变得简单。然而,我知道我需要改变我的业务逻辑,因为没有这样的方法。

没有标准的方法来做到这一点(除非你在c++ 0x中使用可变sizeof(Args...)),但这不是重点——这个问题是错误的。

使用重载解析

template <typename T>
void clear (ptr<T> & obj) {
    destroy (obj);
}
template <typename T, int N>
void clear (ptr_arr<T,N> & obj) {
    destroy_arr (obj);
}

您可以使用mpl::template_arity(未公开)

http://www.boost.org/doc/libs/1_40_0/boost/mpl/aux_/template_arity.hpp

没有办法做到这一点。想象一下重载的数量。

template<int> struct A;
template<bool> struct B;
template<char> struct C;
template<typename> struct D;
template<D<int>*> struct E;
template<D<bool>*> struct F;
template<typename, int> struct G;
// ...

对于每一个,您都需要一个不同的模板来接受它们。您甚至不能使用c++ 0x的可变模板,因为模板参数包只适用于一种参数形式和类型(例如,int...只适用于充满整数的参数包)。