gpt4 book ai didi

c++ - spirit 业力: access noncopyable pointer

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:33 34 4
gpt4 key购买 nike

我试图访问我的业力语法中的指针 vector ,但收效甚微。指针类型是不可复制的,因此使用它的规则必须采用引用:

#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 here ,但是,我在模板库上工作,并且认为不可能将 deref_iterator 专门化为模板相关类型。

关于如何使示例工作的任何想法?

最佳答案

llonesmiz 在评论中回答了我的问题,因此我发布了他的内部信息以供将来引用。使用自定义点transform属性问题可以这样解决:

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

template <typename Value1, typename Value2>
struct test1 : boost::noncopyable {
test1(Value1 i = Value1(), Value2 j = Value2() ): value1(i),value2(j) {}
Value1 value1;
Value2 value2;
};

struct test2 : boost::noncopyable {
int value;
std::vector<test1<int,double>*> vector;
};

BOOST_FUSION_ADAPT_TPL_STRUCT(
(Value1)(Value2),
(test1) (Value1)(Value2),
(Value1, value1)
(Value2, value2))

typedef std::vector<test1<int,double>*> test1_vector;

BOOST_FUSION_ADAPT_STRUCT( test2, (int, value) (test1_vector, vector) )

typedef std::ostream_iterator<char> Iterator;

namespace boost { namespace spirit { namespace traits
{
template <typename Value1, typename Value2>
struct transform_attribute<test1<Value1,Value2>* const, test1<Value1,Value2>&, karma::domain>
{
typedef test1<Value1,Value2>& type;
static type pre(test1<Value1,Value2>* const& val)
{
return *val;
}
};
}}}

int main() {

karma::rule<Iterator, test1<int,double>*()> t1r;
karma::rule<Iterator, test2&()> t2r;

t2r %= "test 2 rule:" << karma::int_ << karma::eol << (t1r % karma::eol);
t1r %= "test 1 rule: " << karma::attr_cast<test1<int,double>*,test1<int,double>&>(karma::delimit(karma::space)[karma::int_<< karma::double_]);

std::stringstream stream;
std::ostream_iterator<char> out(stream);

test2 t;
t.vector.push_back(new test1<int,double>(2));
t.vector.push_back(new test1<int,double>(3));
t.vector.push_back(new test1<int,double>(4));
t.vector.push_back(new test1<int,double>(5));
t.value = 1;

karma::generate(out, t2r, t);
std::cout<<stream.str()<<std::endl;
}

关于c++ - spirit 业力: access noncopyable pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450230/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com