gpt4 book ai didi

c++ - 如何定义 is_iterator 类型特征?

转载 作者:可可西里 更新时间:2023-11-01 15:07:27 32 4
gpt4 key购买 nike

  • 我正在尝试编写 is_iterator<T>类型特征。何时何地T是迭代器类型 is_iterator<T>::value == true否则是 is_iterator<T>::value == false .

  • 到目前为止我尝试了什么:


template <class, class Enable = void> 
struct is_iterator : std::false_type {};

template <typename T>
struct is_iterator<T, typename std::enable_if<std::is_pointer<typename
std::iterator_traits<T>::pointer>::value>::type> : std::true_type {};

LIVE DEMO


问:有没有更合适的方法来定义 is_iterator类型特征与上面显示的不同?

最佳答案

正如我在评论中所说,此处提供的解决方案在某些实现中依赖于 iterators_traits 的不可移植属性。根据 C++03 和 C++11 标准,iterator_traits 仅为迭代器(以及指针的特殊情况)定义,因此任何其他用途都是未定义的行为。具体来说,在 SFINAE 上下文中使用 iterator_traits<T>::pointer 不能保证有效,因为实例化 iterator_traits<T> 将引用 T::value_typeT::pointerT::iterator_category 等,这发生在 SFINAE 不适用的“直接上下文”之外。

C++14 will fix that 本来应该解决这个问题(它发生在 C++14 之后的 DR 2408 ),但是对于 C++11 来说,定义 is_iterator 的安全方法是写检查迭代器必须定义的所有必需操作的特征。所有迭代器都需要支持的唯一操作是 operator* 和前后递增。不幸的是,有些类型定义了那些不是有效迭代器的操作,因此编写正确的特征非常困难。

关于c++ - 如何定义 is_iterator 类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25290462/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com