微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将迭代器传递给模板但只接受某些数据类型

如何解决将迭代器传递给模板但只接受某些数据类型

我在将迭代器传递给函数方面有点挣扎。

我想完成这样的事情。 void func(MyClass* foo,numberOfFoo);

但我想使用迭代器,它应该支持任何 stl 容器。

我知道我可以写一个这样的函数

void foo(std::vector<MyClass>::const_iterator start,std::vector<MyClass>::const_iterator end){
    while (start != end){
        //Do stuff with *start,which has type MyClass
        ++start;
    }
}

我也知道我可以写这样的模板:

template <class Iterator>
void foo( Iterator first,Iterator last){
    while (start != end){
        //Do stuff with *start,which has ANY type
        ++start;
    }
}

但我现在想写一个模板,其中迭代器的数据类型是 MyClass 类型,没有其他类型。

最后应该发生以下情况:

std::vector<MyClass> vectorOfClass;
std::array<MyClass> arrayOfClass;
std::vector<int> vectorOfInt;

foo(vectorOfClass.begin(),vectorOfClass.end()); //Should compile
foo(arrayOfClass.begin(),arrayOfClass.end());   //Should compile
foo(vectorOfInt.begin(),vectorOfInt.end());     //Should not compile

也许解决方案很简单,但我不知道要搜索什么。

已经感谢您的帮助。

解决方法

如果您不需要重载,则不需要 SFINAE,并且可以使用 std::is_same_vstd::iterator_traits 进行简单的 static_assertstatic_assert 可以生成非常明确的编译错误。

#include <iterator>     // std::iterator_traits
#include <type_traits>  // std::is_same_v

template<class It>
void foo(It first,It last) {
    static_assert(std::is_same_v<class std::iterator_traits<It>::value_type,MyClass>,"Only ranges of MyClass objects are accepted by foo()");
    //...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。