前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++11:如何判断一个类是另一个模板类的子类?

C++11:如何判断一个类是另一个模板类的子类?

作者头像
10km
发布2019-05-25 22:07:39
2.5K0
发布2019-05-25 22:07:39
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433593

我有一个模板类memory_cl<T>,我需要判断另一个类是否为它的子类,怎么实现呢?

开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否为一个模板类的实例?》

上面这个链接中给出了完整的答案:

代码语言:javascript
复制
struct is_kind_of_
{
    template <template <class> class TM, class T> static std::true_type  check(TM<T>);
    template <template <class> class TM>          static std::false_type check(...);
    template <template <int>   class TM, int N>   static std::true_type  check(TM<N>);
    template <template <int>   class TM>          static std::false_type check(...);
};
#define is_kind_of(TM, ...) decltype(is_kind_of_::check<TM>(std::declval<__VA_ARGS__>()))

经过测试,确实是有效的,但是只是在gcc(我用的是5.2.0版本)编译器下有效,

但在VS2015下编译是不能通过的,VS2015虽然几乎支持了所有C++11的特性,但还有两三个特性没有支持,这其中就包括”表达式 SFINAE”,上面这个方法在VS2015下编译报错大概就是载在这个坑里了。

所以要想在VS2015下实现这个功能还得别想办法,于是参照上面的方法我把代码做了修改:

代码语言:javascript
复制
/* 模板函数,检查T是否为memory_cl的子类 */
template<typename T>
struct is_kind_of_memory_cl{
    template <typename CL_TYPE>
        static CL_TYPE  check(memory_cl<CL_TYPE>);
    static void check(...);
    using cl_type=decltype(check(std::declval<T>()));// T实例化memory_cl时的模板参数类型
    enum{value=!std::is_same<cl_type,void>::value};
};

问题解决。


关于VS2015对C++11的支持情况,参见微软的官方文档《支持 C++11/14/17 功能(现代 C++)》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档