我想要做的是返回一個ForwardIterator(或者甚至是一對begin和end迭代器),以便可以將uderlying實現隱藏在客戶端類中。 我找不到任何這樣的例子。通過返回一個迭代器來隱藏STL容器實現
如果底層實現是向量,迭代器是vector :: iterator ..即使您對輸出進行模板化,這似乎也不起作用。
我想要做的是返回一個ForwardIterator(或者甚至是一對begin和end迭代器),以便可以將uderlying實現隱藏在客戶端類中。 我找不到任何這樣的例子。通過返回一個迭代器來隱藏STL容器實現
如果底層實現是向量,迭代器是vector :: iterator ..即使您對輸出進行模板化,這似乎也不起作用。
你不能同時返回一個對象,並期望調用者不知道它的類型。 「隱藏」任何對象的實際類型的典型方法是將其隱藏在接口後面。
例如,您可能要編寫這樣的事:
template<typename T>
class Cursor
{
public:
typedef T value_type;
virtual ~Cursor() {}
virtual bool has_result() = 0;
virtual value_type get_result() = 0;
};
// implements cursor interface for any sequence
// described as a pair of forward iterators.
template<typename I>
class ForwardSequenceCursor :
public Cursor<std::iterator_traits<I>::value_type>
{
I myCurrent;
const I myEnd;
public:
ForwardSequenceCursor(I begin, I end)
: myCurrent(current), myEnd(end)
{}
virtual bool has_result() {
return myCurrent != myEnd;
}
virtual value_type get_result() {
return *myCurrent++;
}
};
然後,您可以返回任何正向序列爲:
class Foo
{
std::vector<int> myValues;
public:
std::unique_ptr< Cursor<int> > values() {
return std::unique_ptr< Cursor<int> >(
new ForwardSequenceCursor<vector<int>::const_iterator>(
myValues.begin(), myValues.end()
)
);
}
};
並使用它像這樣:
std::unique_ptr< Cursor<int> > cursor = foo.values();
while (cursor->has_result()) {
std::cout << cursor->get_result() << std::endl;
}
ForwardIterator是一個概念,而不是一個類型。你需要聲明你的函數返回一個類型。
沒有基類「ForwardIterator」的,正常的STL的方法是有一個typedef到在實際的迭代器類型的類,以便客戶端代碼可以像這樣使用它:
MyClass :: iterator it = myclass.begin();
隱藏不是很好,但仍然可以讓您稍後更改實現而無需更改客戶端代碼。
你不能直接做你想做的事情,因爲正如其他人所說,如果你的客戶是布萊恩g得到一個返回值,它需要知道返回值是什麼。周圍
一種方法是做這樣的事情:
template<typename Collection> class MyClass
{
typedef Collection::iterator ReturnIt;
typedef std::pair<ReturnIt, ReturnIt> IteratorPair;
ReturnIt foo();
IteratorPair bar();
};
現在,這不會從客戶看到容器類型中解放,但接口未綁定到容器類型。
你是什麼意思「似乎沒有工作」?請更精確。 – larsmoa 2012-04-06 18:36:57
你能展示一些代碼嗎?很難從你的描述中猜出什麼是錯的 – plaisthos 2012-04-06 18:37:34