考虑模板类C,其中包含通过模板模板参数和两个策略定义的策略集:
template<class T> struct PolicyOne { };
template<class T, int U, int V> struct PolicyTwo { };
template<class T, template<class> class POLICY> struct C { POLICY<T> policy; };
void f()
{
C<int, PolicyOne> mc1;
C<int, PolicyTwo<1, 2> > mc2; // doesn't work this way
}
由于模板参数数量错误, PolicyTwo
不起作用。
如果您指定其他模板参数的类型,是否可以使用PolicyTwo
作为POLICY
模板参数?
我正在使用C ++ 03,因此别名声明不可用。 我知道this question,但我没有看到解决问题的方法。
答案 0 :(得分:3)
根据策略的使用方式,您可以使用继承来代替别名模板进行管理:
template<int U, int V> struct PolicyTwoAdaptor {
template<class T> struct type: PolicyTwo<T, U, V> { }; };
C<int, PolicyTwoAdaptor<1, 2>::type> mc2;
答案 1 :(得分:0)
我看不到hwo用你当前的机制来解决这个问题,但你可以改变它的工作方式,它应该编译得很好(甚至可以通过删除类模板参数来降低复杂性):
template <typename T> struct PolicyBase { typedef T value_type; };
template<class T> struct PolicyOne : public PolicyBase<T> { };
template<class T, int U, int V> struct PolicyTwo : public PolicyBase<T> { };
template<class POLICY> struct C { POLICY policy; typedef typename POLICY::value_type T; };
void f()
{
C<PolicyOne<int> > mc1;
C<PolicyTwo<int, 1, 2> > mc2; // doesn't work this way
}
基本思想是将类型tempalte参数移出策略用户,并为其提供完全实例化的策略。然后,策略通过typedef(如果需要)将其模板类型提供给策略用户。