2014-02-21 3 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 그게 어떤 경우에 유용 할 것입니다. 이 특정 인스턴스의 경우 정책의 기능이 PolicyClass 멤버 함수에서 사용되므로 특히 3 가지 정책이 항상 필요합니다. – scmcduffee

+0

가변 템플릿과 함께 무제한의 정책을 실제로 사용할 수 있습니다. 그들은 일정한 인터페이스를 가지고 있어야합니다. 만약 그것을 3으로 제한하고 싶다면,'template struct PC : P1, P2, P3 {};'도 잘 작동합니다. –

관련 문제