C++ c+中的迭代器类别+;

C++ c+中的迭代器类别+;,c++,interface,iterator,categories,C++,Interface,Iterator,Categories,上面提到了迭代器类别: 迭代器的每个类别不是由特定类型定义的,而是由可以对其执行的操作定义的。这个定义意味着任何支持必要操作的类型都可以用作迭代器 在运行前是否可以强制执行(类似于必须实现的java接口) 这与。任何东西都可以将自己声明为特定类别的迭代器,而无需实现所有必需的方法 它是如何执行的?很简单。然后,如果您尝试将此类别与使用特定于类别的运算符的方法或函数一起使用,因为它们未定义,则会出现编译错误。编译器强制执行它 但是迭代器类别的实际使用完全是倒退的。模板假设将自己标识为特定类别的迭代

上面提到了迭代器类别:

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

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


这与。

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

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

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

例如(就在我的头顶上),假设您希望您的模板函数仅用于随机访问迭代器:

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
}
模板类必须是\u随机\u访问\u迭代器;
模板类必须是\u随机\u访问\u迭代器{
公众:
typedef int或_else;
};
模板无效部分功能(iter类型iter)
{
typedef必须是\u随机\u访问\u迭代器<
类型名称std::迭代器特征::迭代器类别
>::或其他或其他;
//…更多代码
}
must\u be\u random\u access\u iterator
模板专门用于
std::random\u access\u iterator\u标记
类别,否则它是未定义的,因此向模板函数传递其他迭代器类型将导致编译错误


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

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

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

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

例如(就在我的头顶上),假设您希望您的模板函数仅用于随机访问迭代器:

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
}
模板类必须是\u随机\u访问\u迭代器;
模板类必须是\u随机\u访问\u迭代器{
公众:
typedef int或_else;
};
模板无效部分功能(iter类型iter)
{
typedef必须是\u随机\u访问\u迭代器<
类型名称std::迭代器特征::迭代器类别
>::或其他或其他;
//…更多代码
}
must\u be\u random\u access\u iterator
模板专门用于
std::random\u access\u iterator\u标记
类别,否则它是未定义的,因此向模板函数传递其他迭代器类型将导致编译错误


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

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

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

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

例如(就在我的头顶上),假设您希望您的模板函数仅用于随机访问迭代器:

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
}
模板类必须是\u随机\u访问\u迭代器;
模板类必须是\u随机\u访问\u迭代器{
公众:
typedef int或_else;
};
模板无效部分功能(iter类型iter)
{
typedef必须是\u随机\u访问\u迭代器<
类型名称std::迭代器特征::迭代器类别
>::或其他或其他;
//…更多代码
}
must\u be\u random\u access\u iterator
模板专门用于
std::random\u access\u iterator\u标记
类别,否则它是未定义的,因此向模板函数传递其他迭代器类型将导致编译错误


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

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

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

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

例如(刚刚离开)