2013-09-10 3 views
1

Я знаю, ValueIterator от JsonCPP не может использоваться в стандартных алгоритмах STL напрямую. Но есть какой-то «косвенный» способ использовать его в алгоритмах STL (возможно, через Boost.Iterator или что-то в этом роде)? Я хочу что-то любит следующее:Использование JsonCPP ValueIterator с алгоритмами STL

Json::Value root = getJson(); //came from outside 
std::vector<Json::Value> vec; 

std::copy 
    (make_some_smart_iterator(...) // some iterator produced with start of root 
    , make_some_smart_iterator(...) // some iterator produced with end of root 
    , std::back_inserter(vec) 
); 
+1

Я предполагаю, что вы должны будете написать какое-то итератор типа обертки, например, используйте 'boost :: iterator_facade' или получайте из' std :: iterator'. –

+0

@NateKohl - Согласен. Другими рассматриваемыми параметрами являются 'boost :: function_input_iterator' или' boost :: iterator_adaptor'. – Loom

ответ

1

Существует обычай итератор, полученный из boost::iterator_facade.

#include <boost/iterator/iterator_facade.hpp> 

class JsonIter : public boost::iterator_facade 
    <JsonIter, Json::ValueIterator, boost::forward_traversal_tag, Json::Value &> 
{ 
public: 
    JsonIter() {} 
    explicit JsonIter(Json::ValueIterator iter) : m_iter(iter) {} 
private: 
    friend class boost::iterator_core_access; 

    void increment() { ++m_iter; } 
    bool equal(const JsonIter &other) const {return this->m_iter == other.m_iter;} 
    Json::Value &dereference() const { return *m_iter; } 
    Json::ValueIterator m_iter; 
}; 

И код клиента следующее:

std::copy(JsonIter(root.begin()), JsonIter(root.end()), std::back_inserter(vec)); 

 Смежные вопросы

  • Нет связанных вопросов^_^