【问题标题】:iterator categories in c++C ++中的迭代器类别
【发布时间】:2015-08-03 20:41:06
【问题描述】:

this site 上提到了迭代器类别:

每个迭代器类别不是由特定类型定义,而是由可以对其执行的操作来定义。这个定义意味着任何支持必要操作的类型都可以用作迭代器

是否/可以在运行前以某种方式强制执行(类似于必须实现的 java 接口)?

这与this question有关。

【问题讨论】:

  • 可能使用 C++17 中的概念可以部分强制执行。但是,没有切实可行的方法来强制执行复杂性要求。
  • 如果你将一些东西传递给一些需要一些操作才有效的函数模板,而所说的东西不支持所说的操作,那么模板根本不会编译。

标签: c++ interface iterator categories


【解决方案1】:

任何东西都可以将自己声明为特定类别的迭代器,而无需实现所有必需的方法。

它是如何执行的?很简单。如果您尝试将此类别与使用特定于类别的运算符的方法或函数一起使用,因为它们未定义,您会收到编译错误。编译器强制执行它。

但迭代器类别的实际使用完全是倒退的。模板假定将自己标识为特定类别的迭代器完全实现了需求,并使用迭代器的类别来验证它是什么类型的迭代器,否则会强制编译错误。

例如(就在我的脑海中),假设您希望您的模板函数仅与随机访问迭代器一起使用:

template<typename iterator_category> class must_be_random_access_iterator;

template<> class must_be_random_access_iterator<std::random_access_iterator_tag> {
public:
    typedef int or_else;
};


template<typename iter_type> void some_func(iter_type iter)
{
    typedef must_be_random_access_iterator<
         typename std::iterator_traits<iter_type>::iterator_category
    >::or_else or_else;

    // ... more code
}

must_be_random_access_iterator 模板专门用于std::random_access_iterator_tag 类别,否则未定义,因此将一些其他迭代器类型传递给模板函数会导致编译错误。

另一种不太常见且更复杂的方法是使用专门化或SFINAE 来提供同一模板类或方法的不同实现,具体取决于迭代器参数的类别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2015-09-30
    • 2018-03-26
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多