我有像:
这样的数组template<class T> class F
{
...
bool isSet() { return set_; }
T& GetVal() { return val_; }
private:
T val_;
bool set_;
...
}
F<S1> arr1[10];
我正在寻找一个迭代器(或类似迭代器的类)来简化以下内容:
F<S1>* cur = arr1[0];
while(cur.IsSet())
{
S1* ptr = cur->GetVal();
// do something with ptr
cur++;
};
想要更清洁的东西可以使用不同类型的S1,S2等。
答案 0 :(得分:8)
该标准提供了数组的迭代器:
#include <iterator>
T arr[100];
for (auto it = std::begin(arr), end = std::end(arr); it != end; ++it)
{
foo(*it);
it->zap();
}
it
的类型只是T *
,但这会为您提供统一的界面。
术语“迭代器”实际上只是指概念而不是任何特定的代码。裸指针是完全合法的迭代器。重要的是std::iterator_traits
给出了正确的typedef,它对裸指针有效。
答案 1 :(得分:3)
您可以使用Boost Iterator库创建自己的迭代器,尤其是iterator_facade
http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/iterator_facade.html
答案 2 :(得分:2)
你真的在循环,直到你找到一个未设置的F。
使用std::find_if
:
#include <algorithm>
#include <iterator>
template<typename Type>
bool doSomethingOrStopIfNotSet(F<Type>& object)
{
const bool isSet = object.isSet();
if(isSet)
{
// do something
}
return !isSet; // return false so that find_if keeps looking
}
int main()
{
F<int> arr[100];
std::find_if(std::begin(arr), std::end(arr), doSomethingOrStopIfNotSet<int>);
}