Использование JsonCPP ValueIterator с алгоритмами STL

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

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,

#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));
1

Другие решения

Других решений пока нет …