有这样的代码:
#include <iostream>
#include <vector>
template <class T>
class A{
public:
class iterator : public std::vector<T>::iterator{
public:
T& operator*(){
??
}
};
iterator begin(){
return v.begin(); // error
}
iterator end(){
return v.end(); // error
}
void add(const T& elem){
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for(A<int>::iterator it = a.begin(); it != a.end(); ++it){
std::cout << *it << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是std::vector我自己的附加功能的包装.我想使用std::vector的迭代器,但我只想改变operator*迭代器的行为:
T& operator*(){
// do some additional function
// normal behavior, return value of some element in vector
??
}
Run Code Online (Sandbox Code Playgroud)
我如何使用std::vector和它的迭代器只修改operator*?我还想包装函数begin()和end()for迭代器,如何正确包装它们?
编辑:
使用本主题中的答案提示,我设法通过以下方式解决了我的问题:
#include <iostream>
#include <vector>
template <class T>
class A {
public:
class iterator : public std::vector<T>::iterator {
public:
iterator(typename std::vector<T>::iterator c) : std::vector<T>::iterator(c) {
}
T& operator*() {
std::cout << "Im overloaded operator*\n";
return std::vector<T>::iterator::operator *();
}
};
iterator begin() {
return iterator(v.begin());
}
iterator end() {
return iterator(v.end());
}
void add(const T& elem) {
v.push_back(elem);
}
private:
std::vector<T> v;
};
int main() {
A<int> a;
a.add(2);
a.add(4);
for (A<int>::iterator it = a.begin(); it != a.end() ; ++it) {
std::cout << *it << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
也许这对某人有帮助.
包装 stdlib 迭代器最好使用迭代器适配器。这项任务绝非微不足道,Boost.Iterator库可以简化该任务。也许提供的迭代器之一已经解决了您的问题。
如果您打算自己编写这个(我真的不推荐这样做),您应该实现自己的迭代器并使其可以从 a 构造vector::iterator,然后重载所有必需的运算符以满足新迭代器概念的要求楷模。也继承自std::iterator以使特征发挥作用。不要忘记有一个 const 变体。本书有一章专门讨论开发自己的迭代器。还可以获得标准的副本(C++03 或 C++11,在这里并不重要)。你将会需要它。
| 归档时间: |
|
| 查看次数: |
3790 次 |
| 最近记录: |