2011-05-20 37 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

相关问题