Я пытаюсь получить доступ к вектору указателей в моей грамматике кармы без особого успеха. Тип указателя не копируется, поэтому использующее его правило должно принимать ссылку:
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
namespace karma = boost::spirit::karma;
namespace fusion = boost::fusion;
namespace phx = boost::phoenix;
struct test1 : boost::noncopyable {
test1(int i = 0) : value(i) {}
int value;
};
struct test2 : boost::noncopyable {
int value;
std::vector<test1*> vector;
};
BOOST_FUSION_ADAPT_STRUCT( test1, (int, value) );
BOOST_FUSION_ADAPT_STRUCT( test2, (int, value) (std::vector<test1*>, vector) );
typedef std::ostream_iterator<char> Iterator;
int main() {
karma::rule<Iterator, test1*()> t1r;
karma::rule<Iterator, test2&()> t2r;
t2r %= "test 2 rule:" << karma::int_ << karma::eol << (t1r % karma::eol);
t1r %= "test 1 rule: " << karma::int_;
std::stringstream stream;
std::ostream_iterator<char> out(stream);
test2 t;
t.vector.push_back(new test1(2));
t.vector.push_back(new test1(3));
t.vector.push_back(new test1(4));
t.vector.push_back(new test1(5));
t.value = 1;
karma::generate(out, t2r, t);
std::cout<<stream.str()<<std::endl;
}
Это компилируется, но возвращает: правило проверки 2:1, правило проверки 1: 25104656, правило проверки 1: 25104720 и так далее. Я знаю, что в этом простом случае я мог бы сделать
t1r = "test 1 rule: " << karma::int_[karma::_1 = phx::bind(&test1::value, *karma::_val)];
чтобы решить эту проблему, но на самом деле value — это еще один некопируемый тип, который должен быть передан в грамматику, и поэтому мне нужно использовать адаптацию структуры, как это сделано в примере.
Я также знаю о точке настройки deref_iterator, как уже упоминалось здесь , однако я работаю над библиотекой шаблонов и не думаю, что можно специализировать deref_iterator с типом, зависящим от шаблона.
Любые идеи о том, как заставить пример работать?