2014-02-21 148 views
4

我想知道是否可以使用可变参数模板参数来组合策略类,以便每个策略可以拥有自己的模板包。看起来你只能在所有策略中共享一个模板包,但我希望事实并非如此。结合策略类 - 模板模板参数和变量模板

下似乎什么是可能的:

template < 
    class T, 
    template <class, typename...> class Policy1, 
    template <class, typename...> class Policy2, 
    template <class, typename...> class Policy3, 
    typename... Args  
> 
struct PolicyClass 
    : public Policy1  <ObjT, Args...> 
    , public Policy2  <ObjT, Args...> 
    , public Policy3  <ObjT, Args...> {} 

我希望每一个政策可以有它自己的包,所以我可以做这样的事情(?):

template <class T> 
struct implementedPolicy1 {}; 
template <class T> 
struct implementedPolicy2 {}; 
template <class T, class A> 
struct implementedPolicy3 {}; 

PolicyClass <ObjT, 
      implementedPolicy1, 
      implementedPolicy2, 
      implementedPolicy3<AType> 
      > 

的想法每个策略都使用相同的对象类型,但第三个策略还有一些模板。我知道这是上面的不正确的代码 - 只是想说明我想做什么。

感谢

+0

什么'ObjT'?当前课程? –

回答

1

你需要的是能够包之间划定。

// helper template. Using `std::tuple<>` instead is another option. 
template<class...>struct type_list {}; 

// base, note no body: 
template < 
    class T, 
    template <class, typename...> class Policy0, 
    template <class, typename...> class Policy1, 
    template <class, typename...> class Policy2, 
    typename... Packs 
> 
struct PolicyClass; 

// specialization: 
template < 
    class T, 
    template <class, typename...> class Policy0, 
    template <class, typename...> class Policy1, 
    template <class, typename...> class Policy2, 
    typename... A0s, 
    typename... A1s, 
    typename... A2s 
> 
struct PolicyClass< 
    T, Policy1, Policy2, Policy3, 
    type_list<A0s...>, type_list<A1s...>, type_list<A2s...> 
> 
: Policy0<T, A0s...>, Policy1<T, A1s...>, Policy2<T, A2s...> {} 

,我把每政策额外的参数为type_list

从理论上讲,你可以做更有趣的事情,比如特殊的“标签”类型是分隔符,但最终会成为很多体操项目。

PolicyClass< int, bob, eve, alice, type_list<>, type_list<double>, type_list<char, char, char> > foo; 

将创建

PolicyClass: bob<int>, alice<int, double>, eve<int, char, char, char> 

粗略。

+0

谢谢@Yakk - 那么我将如何去使用它呢? – scmcduffee

1

注意,你可能会碰到这样的:

template <class T, 
      template <class> class Policy1, 
      template <class> class Policy2, 
      template <class> class Policy3> 
struct PolicyClass : public Policy1<ObjT>, 
        public Policy2<ObjT>, 
        public Policy3<ObjT> 
{}; 

template <class T> struct implementedPolicy1 {}; 
template <class T> struct implementedPolicy2 {}; 
template <class T, class A> struct implementedPolicy3 {}; 

// Adapt the policy interface 
template <class T> 
using myImplementedPolicy3 = implementedPolicy3<T, AType>; // Assuming AType exist 

PolicyClass <ObjT, implementedPolicy1, implementedPolicy2, myImplementedPolicy3> policies; 
3

我从来没有去过的模板模板参数风扇,这是另外一个例子中,我会避​​免他们:

template <typename T, typename... Policies> 
struct PolicyClass: Policies... {}; 

只会任意策略的工作:

using PC = PolicyClass<int, 
         LifetimePolicy<LP::Extended>, 
         DurabilityPolicy<3600, DP::Seconds> 
         StoragePolicy<int, SP::InMemory>>; 
+0

谢谢@Matthieu在某些情况下这将会很有用。对于这个特定的实例,我特别需要3个策略,因为这些策略的函数在PolicyClass成员函数中使用。 – scmcduffee

+0

实际上,您可以使用无限数量的策略和可变参数模板;只要他们有一个统一的界面。如果你想限制为3,'template struct PC:P1,P2,P3 {};'也很好。 –