2011-05-20 34 views
5

我想確定是否有任何可變類模板是另一個類的基礎。通常我會使用std :: is_base_of,但我不認爲我的用例適合,而且我不確定是否已經有某些東西在std或boost中來處理這個問題。我希望可變基類模板的參數包來自另一個可變類模板。下面是一些例子代碼,希望能解釋什麼,我想做的事:提取可變參數模板參數包並在類型traits元函數的另一個可變參數模板中使用它?

用法:

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

膽:

//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> 
{}; 

這可能嗎?

回答

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> 
{}; 

希望它有幫助!

+0

不知道它改變什麼,但我做了一個小編輯到'VarTemplClassB ',現在它的只是'VarTemplClassB'。 – 2011-05-20 20:47:24

+1

@Johannes:噓,幾秒鐘! :( – Xeo 2011-05-20 20:48:00

+0

Lol,不知道我嘗試過多少種排列組合,沒有登陸這個排行榜,效果非常好,謝謝! – 2011-05-20 20:51:18

4

你就要成功了,但有一個偏特試試吧:

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

嗯,我嘗試了幾件事情。儘管如此,我還沒有完全掌握如何用專業方法來解決問題,但我在那裏開始了。所以偷窺一直是一個巨大的幫助! – 2011-05-20 20:52:44

+0

@pheedbaq:Fighto! ;)但我必須承認,這部分專業化的東西是我真正喜歡的TMP的一部分,尤其是匹配它的模式。 – Xeo 2011-05-20 20:54:29

+0

同樣在這裏。儘管有任何醜陋的小鴨語法,但我始終對TMP能做的事情印象深刻。事實上,這些事情可以在第一時間完成,連同其他語言一樣......非常棒。 – 2011-05-20 21:00:42

相關問題