知道声明中模板形参的数量
Knowing the number of template parameters in the declaration
如果我有,
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
(未公开)
没有办法做到这一点。想象一下重载的数量。
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...
只适用于充满整数的参数包)。
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- 声明成员与否取决于模板形参
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 如何正确声明以函数类型作为形参的模板(如std::function)
- 知道声明中模板形参的数量
- 为什么不允许使用不同数量的模板形参的类/结构声明?