我希望构造函数接受具有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] 删除。
我来说两句