如何在编译时测试B类是否来自std :: vector?
template<class A> struct is_derived_from_vector { static const bool value = ????; };
如何在编译时测试B类是否来自模板系列?
template<class A,template< class > class Family> struct is_derived_from_template { static const bool value = ????; };
使用:
template<class T> struct X {}; struct A : X<int> {} struct B : std::vector<char> {} struct D : X<D> {} int main() { std::cout << is_derived_from_template<A,X>::value << std::endl; // true std::cout << is_derived_from_template<D,X>::value << std::endl; // true std::cout << is_derived_from_vector<A>::value << std::endl; // false std::cout << is_derived_from_vector<B>::value << std::endl; // true }
解决方法
试试这个:
#include <type_traits> template <typename T,template <typename> class Tmpl> // #1 see note struct is_derived { typedef char yes[1]; typedef char no[2]; static no & test(...); template <typename U> static yes & test(Tmpl<U> const &); static bool const value = sizeof(test(std::declval<T>())) == sizeof(yes); };
用法:
#include <iostream> template<class T> struct X {}; struct A : X<int> {}; int main() { std::cout << is_derived<A,X>::value << std::endl; std::cout << is_derived<int,X>::value << std::endl; }
注意:在标记为#1的行中,您还可以使您的特征接受任何具有至少一个但可能更多类型参数的模板:writint:
template <typename,typename...> class Tmpl
原文地址:https://www.jb51.cc/c/117066.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。