c – 如何将模板参数限制为指针或随机访问迭代器?
有没有办法将模板函数的参数类型限制为仅指针或随机访问迭代器?
假设我正在开发一个仅适用于随机可访问容器的排序功能.我正在寻找一种方法来抛出编译时错误,如果用户通过非随机访问迭代器. #include <type_traits> #include <iterator> template <class Iterator> void mySort(Iterator begin,Iterator end){ /*The below condition must be true if the 'Iterator' type is a pointer or if it is of Category random_access_iterator_tag. How to make such check?*/ static_assert(some condition,"The mySort() function only accepts random access iterators or raw pointers to an array.n"); for (Iterator it = begin; it != end; ++it){ /*Some kind of sorting is performed here,which uses arithmetic operators + and - in the iterator type. */ } } 我知道要检查类型是否是指针我可以使用std :: is_pointer< Iterator> :: value并检查迭代器是否是随机访问我可以使用std :: is_same< std :: random_access_iterator_tag,Iterator :: iterator_category> ;::值. 第一个问题是两个检查应该在同一个static_assert()中进行OR运算,否则如果其中一个匹配,则另一个不匹配. 第二个问题是,如果以这种方式调用函数调用,则随机访问检查将失败:mySort< int *>(…).这显然发生,因为int *没有:: iterator_category定义. 有没有人知道如何解决这个问题? 作为后续问题.在’Iterator’是指针类型的情况下,有没有办法断言它是原始类型(非结构/类)? 先感谢您. 解决方法
使用迭代器特征:
static_assert( std::is_same<std::random_access_iterator_tag,typename std::iterator_traits<Iterator>::iterator_category>::value,"The mySort() function only accepts random access iterators or raw pointers to an array.n"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |