c – 检查模板类的某些专门化是否是特定类的基类

c – 检查模板类的某些专门化是否是特定类的基类,第1张

概述现代STL中有std :: is_base_of.它允许我们确定第二个参数是从第一个参数派生的,或者它们是否是相同的类,或者否则确定它们之间是否没有这样的关系. 是否可以确定一个类是从一些具体的模板类派生的,而不区分其专业化涉及的具体实际参数? 说,我们有 template< typename ...types >struct B {}; 和 template< typename ...type 现代STL中有std :: is_base_of.它允许我们确定第二个参数是从第一个参数派生的,或者它们是否是相同的类,或者否则确定它们之间是否没有这样的关系.

是否可以确定一个类是从一些具体的模板类派生的,而不区分其专业化涉及的具体实际参数?

说,我们有

template< typename ...types >struct B {};

template< typename ...types >struct D : B< types... > {};

是否可以定义类型特征:

template< typename T > is_derived_from_B;

当T是D的任何特殊化并且从std :: false_type派生时,如果T不是从B的任何专业化导出的,那么它来自std :: true_type?

解决方法 如果您可以假设派生类型使用B< Args ...>的公共继承(所以可以上传),那么可以使用以下SFINAE:
namespace detail{    template <typename Derived>    struct is_derived_from_B    {        using U = typename std::remove_cv<                                  typename std::remove_reference<Derived>::type                                >::type;        template <typename... Args>        static auto test(B<Args...>*)            -> typename std::integral_constant<bool,!std::is_same<U,B<Args...>>::value>;        static std::false_type test(voID*);        using type = decltype(test(std::declval<U*>()));    };}template <typename Derived>using is_derived_from_B = typename detail::is_derived_from_B<Derived>::type;

测试:

static_assert(is_derived_from_B<const D<int,char,float>>::value,"!");static_assert(!is_derived_from_B<int>::value,"!");static_assert(!is_derived_from_B<B<int,int>>::value,"!");static_assert(!is_derived_from_B<std::vector<int>>::value,"!");

DEMO 1

可以将其概括为接受任何基类模板:

namespace detail{    template <template <typename...> class Base,typename Derived>    struct is_derived_from_template    {        using U = typename std::remove_cv<                                  typename std::remove_reference<Derived>::type                                >::type;        template <typename... Args>        static auto test(Base<Args...>*)            -> typename std::integral_constant<bool,Base<Args...>>::value>;        static std::false_type test(voID*);        using type = decltype(test(std::declval<U*>()));    };}template <template <typename...> class Base,typename Derived>using is_derived_from_template                = typename detail::is_derived_from_template<Base,Derived>::type;

测试:

static_assert(is_derived_from_template<B,const D<int,"!");static_assert(!is_derived_from_template<B,int>::value,B<int,std::vector<int>>::value,"!");

DEMO 2

总结

以上是内存溢出为你收集整理的c – 检查模板类的某些专门化是否是特定类的基类全部内容,希望文章能够帮你解决c – 检查模板类的某些专门化是否是特定类的基类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存