可変オブジェクトへのスマートポインターのコンテナーがあります。2つのfor_eachループを作成する必要があります。1つは読み取り専用データとしてオブジェクトにアクセスするためのもので、もう1つは可変データ用です。std::vector< boost::shared_ptr<Object> >
コンパイラは、と同じではないと言っています。std::vector< boost::shared_ptr<const Object> >
に注意してくださいconst
。
これが私のサンプルコードです:
#include <vector>
#include "boost/shared_ptr.hpp"
#include <iterator>
class Field_Interface
{ ; };
typedef boost::shared_ptr<Field_Interface> Ptr_Field_Interface;
typedef boost::shared_ptr<const Field_Interface> Ptr_Const_Field_Interface;
struct Field_Iterator
: std::input_iterator<std::forward_iterator_tag, Ptr_Field_Interface>
{
// forward iterator methods & operators...
};
struct Const_Field_Iterator
: std::input_iterator<std::forward_iterator_tag, Ptr_Const_Field_Interface>
{
// forward iterator methods & operators...
};
struct Field_Functor
{
virtual void operator()(const Ptr_Field_Interface&) = 0;
virtual void operator()(const Ptr_Const_Field_Interface&) = 0;
};
class Record;
typedef boost::shared_ptr<Record> Ptr_Record;
typedef boost::shared_ptr<const Record> Ptr_Const_Record;
class Record_Base
{
protected:
virtual Field_Iterator beginning_field(void) = 0;
virtual Field_Iterator ending_field(void) = 0;
virtual Const_Field_Iterator const_beginning_field(void) = 0;
virtual Const_Field_Iterator const_ending_field(void) = 0;
void for_each(Field_Functor * p_functor)
{
Field_Iterator iter_begin(beginning_field());
Field_Iterator iter_end(ending_field());
for (; iter_begin != iter_end; ++ iter_begin)
{
(*p_functor)(*iter_begin);
}
}
};
class Record_Derived
{
public:
typedef std::vector<Ptr_Field_Interface> Field_Container;
typedef std::vector<Ptr_Record> Record_Container;
private:
Field_Container m_fields;
Record_Container m_subrecords;
};
Record_Base
上記のすべての詳細を考えると、 inの純粋な抽象メソッドを実装するにはどうすればよいRecord_Derived
ですか?
私はもう試した:
- を返します。これ
は変換エラーを返します(変換できませ
m_fields.begin()
ん)std::vector<...> to Field_Iterator
- を返す
&m_fields[0]
。これは、の内部に関するものを想定しているため、危険ですstd::vector
。
ところで、std::for_each
フィールドのコンテナとサブレコードのコンテナを反復処理する必要があるため、使用していません。