2

要素と属性の両方の範囲ベースのループでこのようなものを機能させるにはどうすればよいですか?

#include <list>
#include "XMLAttribute.h"

namespace XML
{
    class Element
    {
        private:
            typedef std::list<Attribute> attribute_container;
            typedef std::list<Element> element_container;

        public:
            XMLElement();

            bool has_attributes() const;
            bool has_elements() const;
            bool has_data() const;

            const std::string &name() const;
            const std::string &data() const;

        private:
            std::string _name;
            std::string _data;

            attribute_container _attributes;
            element_container _elements;
    };
}

次のようなものを使用できるようにしたいと思います。

for (XML::Element &el : element) { .. }
for (XML::Attribute &at : element) { .. }

そして、のようなものをブロックしますfor (auto &some_name : element) { .. } //XML::Element or XML::Attribute?

このように実装するのは良い考えですか、それともデザインを変更する必要がありますか?

4

1 に答える 1

5

正しい答えは、子属性と要素の範囲を返す要素ノード関数を与えることです。したがって、これを行うことができます:

for(auto &element : element.child_elements()) {...}
for(auto &attribute : element.attributes()) {...}

あなたの関数は、 boost::iterator_rangechild_elementsのように、2 つのイテレータを格納するある種の型を返します。同様に、アトリビュート エレメントの範囲を返します。attributes

于 2012-07-09T18:07:22.070 に答える