3

タイトルに記載されている操作は可能でしょうか?これが私がやりたいことの具体的な例です:

#include <vector>
class Base{
public:
    Base(int t){tst = t;}
protected:
    int tst;
};

class Derived : public Base{
public:
    Derived(int t):Base(t){} 
};

int main(){
    std::vector<Derived> test;
    test.push_back(Derived(1));
    std::vector<Base>::iterator iTest = test.begin();
}

最後の行は失敗します。static_cast を使用しても機能しません。これを行う良い方法はありますか?そうでなければ、派生クラス オブジェクトのベクトルを基本クラス オブジェクトのベクトルとして反復処理するにはどうすればよいでしょうか?

4

2 に答える 2

3

まとめて変換することはできません。

次のようなものが必要だと思います:

std::vector<Base*> test;
test.push_back( new Derived(1) );

std::vector<Base*>::iterator iTest = test.begin();

// ....

// cleanup 

そして、ポリモーフィズムの利点を享受してください。

于 2013-03-13T20:19:46.263 に答える
2

いいえ、タイプは無関係です。

Base一連のオブジェクトを公開して、それらが実際には であるという事実を隠したい場合はDerived、 を使用して実行できますboost::iterator_adaptor。結果の型は ではありませんvector<Base>::iteratorが、逆参照されたときに を与えるイテレータですBase

#include <boost/iterator/iterator_adaptor.hpp>

class BaseIter
    : public boost::iterator_adaptor<
         BaseIter,                         // This class type for CRTP
         std::vector<Derived>::iterator,   // Underlying iterator type
         Base >                            // Desired value_type
{
public:
    BaseIter()
      : iterator_adaptor() {}
    explicit BaseIter( std::vector<Derived>::iterator iter )
      : iterator_adaptor(iter) {}
};

(としてconst Baseではなく、必要になる場合があります。)Basevalue_type

于 2013-03-13T20:14:54.960 に答える