加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 不能将继承的类作为SFINAE的基础进行特征化

发布时间:2020-12-16 10:33:08 所属栏目:百科 来源:网络整理
导读:我创建了一个container_traits类来检查容器是否是std :: array. 但它无法捕获从std :: array继承的容器. 有解决方案吗 #include vector#include array#include iostreamusing namespace std;templatetypename Cstruct container_traits { constexpr static b
我创建了一个container_traits类来检查容器是否是std :: array.
但它无法捕获从std :: array继承的容器.
有解决方案吗

#include <vector>
#include <array>
#include <iostream>

using namespace std;

template<typename C>
struct container_traits { constexpr static bool is_array = false; };
template<typename T,size_t S>
struct container_traits<std::array<T,S>> { constexpr static bool is_array = true; };

template<typename T,size_t S>
struct A : public std::array<T,S> {};

int main()
{
    cout << container_traits<A<int,5>>::is_array << endl;              // must return 1
    cout << container_traits<std::array<int,10>>::is_array << endl;    // must return 1
    cout << container_traits<std::vector<int>>::is_array << endl;       // must return 0
    return 0;
}

解决方法

你可以使用std :: is_base_of:

template <typename C>
struct container_traits {
  constexpr static bool is_array = false;
};

template <template <typename,std::size_t> class C,typename T,std::size_t N>
struct container_traits<C<T,N>> {
  constexpr static bool is_array = std::is_base_of<std::array<T,N>,C<T,N>>::value;
};

See it in action.

它基本上适用于任何带有两个参数的模板类型.在该专业化中,is_array的值由std :: is_base_of确定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读