问题描述
我正在在线阅读一些参考资料,但我对模板模板参数感到困惑。特别是我不明白内部模板参数是如何根据它们的位置传递的。也许一个例子将有助于理解我的困惑
template <typename A,typename B,typename DepA,typename DepB>
class aClass {
...
};
我希望 DepA
必须有 A
作为模板参数和 DepB
,B
。这样我想重铸
aClass<int,double,std::vector<int>,std::deque<double>>
只是为了
aClass<int,std::vector,std::deque>
我应该在模板定义中写什么?
解决方法
template <typename A,typename B,typename DepA,typename DepB>
class aClass;
template <class A,class...As,class B,class...Bs,template<class...>class DA,template<class...>class DB>
class aClass<A,B,DA<A,As...>,DB<B,Bs...>> {
// ...
};
是一种方法;这强制 DepA/DepB 将 A/B 作为第一个参数。它没有得到你想要的语法:
aClass<int,double,std::vector<int>,std::deque<double>>
而是强制将 int
和 double
作为第一个参数传递给第三个和第四个参数。
但是您希望模板为您注入它。要做到这一点:
template<class A,template<class...>class DB>
class aClass {
using DepA = DA<A>;
using DepB = DB<B>;
// ...
};
现在
aClass<int,std::vector,std::deque>
作品;请注意
aClass<int,std::array,std::deque>
不起作用,因为 array
采用非类型模板参数。
template<std::size_t N>
struct fixed_size {
template<class T>
using array = std::array<T,N>;
};
aClass<int,fixed_size<3>::template array,std::deque>
确实如此。