2012-04-06 74 views
2

我想要做的是返回一個ForwardIterator(或者甚至是一對begin和end迭代器),以便可以將uderlying實現隱藏在客戶端類中。 我找不到任何這樣的例子。通過返回一個迭代器來隱藏STL容器實現

如果底層實現是向量,迭代器是vector :: iterator ..即使您對輸出進行模板化,這似乎也不起作用。

+1

你是什麼意思「似乎沒有工作」?請更精確。 – larsmoa 2012-04-06 18:36:57

+0

你能展示一些代碼嗎?很難從你的描述中猜出什麼是錯的 – plaisthos 2012-04-06 18:37:34

回答

2

你不能同時返回一個對象,並期望調用者不知道它的類型。 「隱藏」任何對象的實際類型的典型方法是將其隱藏在接口後面。

例如,您可能要編寫這樣的事:

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; 
} 
0

ForwardIterator是一個概念,而不是一個類型。你需要聲明你的函數返回一個類型。

0

沒有基類「ForwardIterator」的,正常的STL的方法是有一個typedef到在實際的迭代器類型的類,以便客戶端代碼可以像這樣使用它:

MyClass :: iterator it = myclass.begin();

隱藏不是很好,但仍然可以讓您稍後更改實現而無需更改客戶端代碼。

1

你不能直接做你想做的事情,因爲正如其他人所說,如果你的客戶是布萊恩g得到一個返回值,它需要知道返回值是什麼。周圍

一種方法是做這樣的事情:

template<typename Collection> class MyClass 
{ 
    typedef Collection::iterator ReturnIt; 
    typedef std::pair<ReturnIt, ReturnIt> IteratorPair; 
    ReturnIt foo(); 
    IteratorPair bar(); 
}; 

現在,這不會從客戶看到容器類型中解放,但接口未綁定到容器類型。