如何接受通用迭代器?

苹果壳

我希望构造函数接受具有x特征和引用类的任何迭代器y

Class(std::iterator<std::random_access_iterator_tag, MyClass*> it);

但是,当我尝试传递此类迭代器时,编译将失败Candidate constructor not viable: no known conversion from 'iterator' (aka '__deque_iterator<value_type, pointer, reference, __map_pointer, difference_type, __block_size>') to 'std::iterator<std::random_access_iterator_tag, MyClass *>'

插入代码:

std::deque<MyClass*> collection_with_random_access_iterator{};
Class tmp(collection_with_random_access_iterator.begin());

我在这里可以做什么?

土豆泥

迭代器通常被值接受,然后被委派给其他功能。

例如,

    template< typename iterator >
    Class( iterator it ) {
        init_class( * it, typename std::iterator_traits< iterator >::category() );
    }

    template< typename iterator >
    void init_class( iterator it, std::random_access_iterator_tag ) {
        for ( int i = 0; i != 42; i +=3 ) {
            do_something( it[ i ] );
        }
    }

    void do_something( MyClass * ) { … }
};

传递错误的迭代器会导致函数内部出现错误,这对于用户而言可能是一个隐秘的错误。但是,这通常是在标准库实现中发生的事情,也是在发明SFINAE之前最初使用迭代器的方式。如果存在常见的用户错误,则可以专门捕获它们并引导用户注意特定的错误/注释。

如果不需要选择其他行为,而是要确保用户通过了一个随机访问迭代器MyClass *,请使用static_assert带有std::is_same条件的couple作为sbabbi的答案。产生的用户体验比纯SFINAE更好,因为错误消息显示“请传递随机访问迭代器”,而不是“未找到重载”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何打印通用std :: list迭代器?

来自分类Dev

C ++通用迭代器

来自分类Dev

如何使构造函数接受所有类型的迭代器?

来自分类Dev

如何将默认迭代器写入通用列表?

来自分类Dev

接受迭代器的函数文档

来自分类Dev

c ++迭代器列出通用函数

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

无法从通用元素的迭代器构建通用类型

来自分类Dev

如何使用谓词函数和选择器创建通用迭代器扩展方法以创建特殊分组方法

来自分类Dev

如何嵌套迭代器?

来自分类Dev

如何拆分迭代器?

来自分类Dev

如何实现迭代器?

来自分类Dev

如何实现迭代器?

来自分类Dev

以iterable作为参数的函数是否总是接受迭代器?

来自分类Dev

接受迭代器并返回字符串的函数

来自分类Dev

如何迭代几个范围或迭代器的乘积?

来自分类Dev

如何使用asyncio迭代阻塞迭代器?

来自分类Dev

使用通用迭代器而不是特定的列表类型

来自分类Dev

迭代器的通用可变和非可变参数

来自分类Dev

迭代器的通用可变和非可变参数

来自分类Dev

通用结束迭代器与容器`end()`的递减要求

来自分类Dev

为迭代器实现通用方法的正确方法

来自分类Dev

获得二维通用矩阵迭代器

来自分类Dev

使用向量和迭代器 C++ 实现的通用 QuickSort

来自分类Dev

如何实现通用比较器?

来自分类Dev

C#:如何接受两个通用参数

来自分类Dev

如何接受非相当通用但动态类型作为子类的参数?

来自分类Dev

C#:如何接受两个通用参数