有没有办法将模板函数的参数类型限制为仅指针或随机访问迭代器?
假设我正在开发一个仅适用于随机可访问容器的排序功能。我正在寻找一种方法来抛出编译时错误,如果用户通过非随机访问迭代器。
#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>::value
。
第一个问题是两个检查应该在同一个static_assert()
内进行OR运算,否则如果其中一个匹配,则另一个不匹配。
第二个问题是,如果以这种方式调用函数调用,则随机访问检查将失败:mySort<int*>(...)
。这显然是因为int*
没有::iterator_category
定义。
有人知道如何解决这个问题吗?
我也知道编译器会自动为使用非随机访问迭代器的算术运算符抛出错误,但我希望通过static_assert()
显示更全面的错误消息。
作为后续问题。在'Iterator'是指针类型的情况下,有没有办法断言它是原始类型(非struct
/ class
)?
提前谢谢。
答案 0 :(得分:7)
使用迭代器特征:
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");