5

考虑具有通过模板模板参数和两个策略定义设置的策略的模板类 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,所以别名声明不可用。我知道这个问题,但在那里我看不到我的问题的解决方案。

4

2 回答 2

3

根据策略的使用方式,您可以使用继承代替别名模板进行管理:

template<int U, int V> struct PolicyTwoAdaptor {
  template<class T> struct type: PolicyTwo<T, U, V> { }; };
C<int, PolicyTwoAdaptor<1, 2>::type> mc2;
于 2013-04-11T16:01:10.270 回答
0

我看不到如何用你当前的机制解决这个问题,但你可以反转它的工作方式,它应该可以很好地编译(甚至可以通过删除类模板参数来降低复杂性):

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(如果需要)将其模板类型返回给策略用户。

于 2013-04-11T15:20:09.583 回答