C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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&gt ;::值. 第一个问题是两个检查应该在同一个static_assert()中进行OR运算,否则如果其中一个匹配,则另一个不匹配. 第二个问题是,如果以这种方式调用函数调用,则随机访问检查将失败:mySort< int *>(…).这显然发生,因为int *没有:: iterator_category定义.

有没有人知道如何解决这个问题?
我也知道编译器会自动为使用非随机访问迭代器的算术运算符抛出错误,但我想通过static_assert()显示全面的错误消息.

作为后续问题.在’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");

大佬总结

以上是大佬教程为你收集整理的c – 如何将模板参数限制为指针或随机访问迭代器?全部内容,希望文章能够帮你解决c – 如何将模板参数限制为指针或随机访问迭代器?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。