2012-04-06 15 views
2

私がしようとしているのは、クライアントのクラスから見えない実装を隠すことができるように、ForwardIterator(または開始と終了のイテレータのペア)を返します。 そのような例は見つかりませんでした。イテレータを返すことによってSTLコンテナの実装を隠す

基本的な実装がベクトルの場合、イテレータはvector :: iteratorです。出力をテンプレート化しても、これは動作しないようです。

+1

「動作していない」とはどういう意味ですか?もっと正確にしてください。 – larsmoa

+0

いくつかのコードを表示できますか?あなたの記述から何が間違っているのかを推測することは困難です – plaisthos

答えて

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」タイプのない基底クラスはありませんあなたクライアントコードで次のように使用できます。

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(); 
}; 

さて、これはコンテナタイプを見て、クライアントから私たちを解放しませんが、インターフェイスは、コンテナタイプにバインドされていない:それは周り

一つの方法は、このような何かを行うことです。

関連する問題