2011-05-20 16 views
5

Herhangi bir değişken sınıf sınıf şablonunun başka bir sınıfın temeli olup olmadığını belirlemek istiyorum. Tipik olarak std :: is_base_of kullanırım, ama kullanım durumumun uygun olduğunu düşünmüyorum ve bunu yapmak için std veya boostta bir şey olup olmadığından emin değilim. Variadic temel sınıf şablonunun parametre paketinin başka bir variadic sınıf şablonundan gelmesini istiyorum.Variadic şablon parametre paketini ayıklayın ve bir tür özellik meta işlevinde başka bir değişken şablonda kullanın?

Kullanımı:

is_variadic_base_of< 
    VarClassTemplA 
    , ClassDerivedFromA 
    , VarClassTemplB //Has param pack I want to use with ClassA 
>::value; 

Guts:

//test for variadic base of non-variadic 
template <template<typename...> class A, typename B, typename... ArgsC> 
struct is_variadic_base_of 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

bu mümkün mü İşte bazı örnek kod umarım ben yapmak istediğim şey açıklıyor öyle?

cevap

5
template <template<typename...> class A, typename B, typename ArgsC> 
struct is_variadic_base_of; 

template <template<typename...> class A, typename B, 
      template<typename...> class C, typename ...ArgsC> 
struct is_variadic_base_of<A, B, C<ArgsC...>> 
: std::is_base_of<A<ArgsC...>, B> 
{}; 

Umut eder!

+0

Değil emin bir şey değiştirir, ama VarTemplClassB '' küçük düzenlemeyi yaptık, şimdi var sadece 'VarTemplClassB'. –

+1

@Johannes: Boo, bir kaç saniye! :( – Xeo

+0

Lol, kaç tane permütasyon yaptığımı bilmiyorum ve buna inanamadım. Mükemmel çalışıyor .. Teşekkürler! –

4

Neredeyse geldin, ama kısmi uzmanlaşma ile deneyin:

template< 
    template<class...> class A, class B, class C 
> 
struct is_variadic_base_of; 

// partial spec 
template< 
    template<class...> class A, class B, 
    template<class...> class C, class... ArgsC 
> 
struct is_variadic_base_of< A,B,C<ArgsC...> > 
    : std::is_base_of< A<ArgsC...>,B > 
{}; 
+0

Pek çok şey denedim. Hala uzmanlıklarla bir şeyler nasıl doğramayacağına dair dayanak yok, ama ben oraya gidiyorum. SO peeps büyük bir yardım oldu! –

+0

@pheedbaq: Fighto! ;) Ama itiraf etmeliyim ki, bu kısmi uzmanlık işleri gerçekten çok sevdiğim TMP'nin bir parçası. – Xeo

+0

Aynı burada. Çirkin ördek yavrusu sözdizimine rağmen, TMP'nin yapabileceği şeylere her zaman hayran kaldım. Sadece bu şeylerin ilk etapta yapılabilmesi gerçeği, dilin yaptığı her şeyle birlikte ... oldukça harika. –