专栏首页10km的专栏C++11:如何判断一个类是另一个模板类的子类?

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

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/50845588

我有一个模板类memory_cl<T>,我需要判断另一个类是否为它的子类,怎么实现呢? 开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否为一个模板类的实例?》 上面这个链接中给出了完整的答案:

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下实现这个功能还得别想办法,于是参照上面的方法我把代码做了修改:

/* 模板函数,检查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++)》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • swift-annotations:java编译时警告主版本 52 比 51 新, 此编译器支持最新的主 版本。

    今天在java bean代码中加入swift的注释时,编译时提示了警告: [javac] 警告: J:\facelog\db\sql2java\lib\swi...

    用户1148648
  • CImg:插件(plugin)使用说明塈实现JPEG图像内存编码/解码

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • c++11:基于STL实现字符串分割更简单 wstring,string split

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • Pymongo index索引相关操作总结

    其中最主要的是create_index, 可以用它来为mongo的collection建立索引。

    弄啥嘞
  • python函数——List获取索引(多相同值解决方法)

    在处理list 的时候,我们需要获取一个值所在的索引坐标,可以使用list.index()方法, 在遇到需要获取索引的值有多个,需要返回多个索引,可以使用偷梁换...

    莫斯
  • WordPress固定链接后404解决方法

    一般Wordpress自带的链接是一大串数字加符号,不美观也不明确,一般要设置成固定链接,而设置成功后大部分情况访问文章,子链接都会出现404界面,我找了网上的...

    咕咕星
  • SAP最佳业务实践:MM–组件收费的委外加工(251)-7收货

    4.8 ME2M查找采购订单 本活动是参照采购订单,对委外加工商加工的产品S251-1的采购订单进行过帐收货。 你可以按以下步骤检查S251-1 的采购订单号码...

    SAP最佳业务实践
  • TLS握手:回顾1.2、迎接1.3

    HTTPS或者说SSL or TLS现在都是老生常谈的东西了,为什么还要写这篇文章?

    FB客服
  • C++11 POD类型

    POD(Plain Old Data,普通旧数据)类型是从C++11开始引入的概念,Plain代表它是一个普通类型,Old代表它可以与C兼容。通俗的讲,一个类、...

    Dabelv
  • 使用Python生成自己的特色二维码

    二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code...

    星星在线

扫码关注云+社区

领取腾讯云代金券