[英]Override only operator*() of iterator of a custom datastructure
我有一個數組類MyArray
和MyArray
。
為了簡單起見,這就是整個代碼。 可以。
#include <iostream>
using namespace std;
template<class T> class MyArray;
template<class T>class MyIterator{
public: int index=0;
public: MyArray<T>* myArray;
public: MyIterator<T> operator++(){
index++;
return *this;
}
public: T& operator*(){
return myArray->database[index];
}
public: friend bool operator!=(MyIterator<T> b,MyIterator<T> c){
return b.index!=c.index;
}
};
template<class T>class MyArray{
public: T database[5];
public: MyArray(){
database[2]=3; //just fill with something to test
}
public: MyIterator<T> begin(){
MyIterator<T> r; r.index=0; r.myArray=this;
return r;
}
public: MyIterator<T> end(){
MyIterator<T> r; r.index=5; r.myArray=this;
return r;
}
};
這是它的用法:
int main() {
MyArray<int> test;
for(int ele:test){
std::cout<<ele<<std::endl;
}
return 0;
}
我有特定的類,可以說它們的名稱是B
和C
我有一個從B
到C
的轉換器 ,名為convertBToC(B)
。
現在,我想要一個新的數據結構(名為MyArray2
):-
MyArray<B>
...。 MyArray2
的迭代器的函數operator*()
返回C
而不是B
C
,使用convertBToC(B)
從B
進行轉換。 這是我希望用於( #1
)的用法:
MyArray2 test;
//test.push_back(B()); //used like "MyArray<B>"
for(C c:test){ //"C", not "B"
.... logic about "c" ....
}
上面的代碼就像我這樣稱呼它:-
MyArray<B> arr;
for(B& b: arr){
C c= convertBToC(b); //<-- I want to hide this line
.... logic about "c" ....
}
問題:如何編寫MyArray2
?
我想要一個解決方案:-(按優先級排序)
std::function
及其家族) MyIterator
(因為MyIterator
是一個內部類) MyArray<T>
最小更改(如果有) 最相關的問題在這里 ,但它提到了std::vector
。
創建2個課程:-
從MyArray<B>
派生的MyArray2
覆蓋: begin()
或end()
-返回MyIterator2
。
MyIterator2
衍生自MyIterator<B>
覆蓋: operator*()
-返回C
(使用convertBToC()
)。
壞處:
MyArray2.h
代碼包含單詞MyIterator<T>
。 僅創建1個課程:-
MyArray<B>
派生的MyArray2
iterate()
:- 這是iterate()
的草案:
template<typename F> MyArray2::iterate( F lamdbaFunction ){
for(B b: MyArray<B>){
C c= convertBToC(b);
lamdbaFunction(c);
}
}
用法必須從#1
更改為...( #2
)
MyArray2 arr;
auto lambdaF=[&](C c){
.... logic about "c" ....
}
arr.iterateElement(lambdaF);
壞處
另一種方法是使用Boost范圍適配器,特別是boost::adaptors::transformed
。
#include <boost/range/adaptor/transformed.hpp>
...
MyArray<B> test;
for(C ele : test | boost::adaptor::transformed(convertBToC)) {
// something...
}
判斷自己的進步有多大。 也許最好把operator|
在新的MyArray
的成員函數中調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.