C++ 缺失特征的默认行为元函数及如何检测随机访问

C++ 缺失特征的默认行为元函数及如何检测随机访问,c++,c++11,metaprogramming,C++,C++11,Metaprogramming,以下元函数计算给定类型是否为随机访问迭代器: template <class I> struct is_random_access : boost::is_convertible < typename boost::iterator_traversal<I>::type , boost::random_access_traversal_tag > {}; 模板 结构是随机

以下元函数计算给定类型是否为随机访问迭代器:

    template <class I>
    struct is_random_access
        : boost::is_convertible
        < typename boost::iterator_traversal<I>::type
        , boost::random_access_traversal_tag
        >
    {};
模板
结构是随机访问
:boost::可转换吗

{};
当然,如果
I
根本不是迭代器,这就不起作用,因为没有定义
boost::iterator\u遍历

两个独立的问题:

  • I
    不是迭代器时,如何使
    is\u random\u access
    返回false(而不是编译失败)
  • 这是检测迭代器是否可以随机访问的好方法吗

  • 对于第一个问题,您可以实际使用:

    使用void的模板\u t=void;
    模板
    结构是随机访问:boost::false\u类型
    {};
    模板
    结构是随机访问
    :boost::可转换吗
    {};
    
    如果输入类型没有定义
    iterator\u类别
    类型,它将返回默认结构,如果定义了,它将使用您的专门化

    对于第二个问题,我不是专家。但是,我的解释与你的解释一致:对于每个带有
    std::random\u access\u iterator\u标记的迭代器
    boost::iterator\u traversal::type
    将转换为
    boost::random\u access\u traversal\u标记



    更新:修复了int*未重新识别为有效迭代器的问题。将
    I:iteratory\u category
    替换为
    std::iterator\u traits::iterator\u category

    1。我不想给调度贴标签。我希望元函数按要求工作。2.std::random\u access\u iterator\u tag不是随机访问遍历标记的子集吗(即,有一些随机访问遍历迭代器不是std::random\u access\u iterator\u tag)?类似于
    std::conditional::type::type
    。非常感谢,这非常简洁。我不知道
    void\t
    技术,它非常有用。不幸的是,这个解决方案不太管用。我们不能使用
    I::iterator\u category
    ,因为我们还希望例如
    is\u random\u access
    有效且为真。因此它必须是
    boost::iterator_traversal::type
    ,但是,由于更新了消息,sfinae并不是这样工作的(更改为该值以查看错误)。作为记录,
    std::iterator\u traits::iterator\u category
    确实有效,而
    boost::iterator\u traversal::type
    则无效,这显然是一个关于已经模糊的sfinae模式的相当模糊的事情。
    template <class... Ts> using void_t = void;
    
    template <class I, class = void>
        struct is_random_access: boost::false_type
        {};
    
    template <class I>
        struct is_random_access<I,void_t<typename std::iterator_traits<I>::iterator_category> >
            : boost::is_convertible
            <typename boost::iterator_traversal<I>::type, boost::random_access_traversal_tag>
        {};