问题描述
我在将迭代器传递给函数方面有点挣扎。
我想完成这样的事情。 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_v
和 std::iterator_traits
进行简单的 static_assert
。 static_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()");
//...
}