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>
{};