C++11:如何判断一个类是另一个模板类的子类?
2016-03-10 12:45
429 查看
我有一个模板类
开始我问了度娘,在知乎上找到了答案 —>《如何判断一个类是否为一个模板类的实例?》
上面这个链接中给出了完整的答案:
经过测试,确实是有效的,但是只是在gcc(我用的是5.2.0版本)编译器下有效,
但在VS2015下编译是不能通过的,VS2015虽然几乎支持了所有C++11的特性,但还有两三个特性没有支持,这其中就包括”表达式 SFINAE”,上面这个方法在VS2015下编译报错大概就是载在这个坑里了。
所以要想在VS2015下实现这个功能还得别想办法,于是参照上面的方法我把代码做了修改:
问题解决。
关于VS2015对C++11的支持情况,参见微软的官方文档《支持 C++11/14/17 功能(现代 C++)》
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++)》
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- C++类模板与模板类深入详解
- C++模板类的用法实例
- C++模板类的用法
- 在 Qt4 中使用 C++11
- c++11新特性--decltype auto
- centos安装devtoolset-3支持gcc 4.9.2
- 使用eclipse编译含有C++11特性的代码
- 怎样在Linux环境编译支持C11
- eclipse支持c++11
- C++11可变参数函数与for循环
- vs2013 编译c++是发现惊天bug
- 简单性能测试函数模板
- 关于C++现状的一些思考
- 用C++11优化矩阵运算的空间和时间效率
- 浅析构造函数之默认构造函数
- c++中返回数组的函数
- C++函数重载的几个问题
- C++11 note-2 字符串 容器 迭代器
- C++11 现代C++风格的新元素