2014-02-21 190 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 {};'也很好。 –