精神业力:访问不可复制指针
spirit karma: access noncopyable pointer
我试图访问我的因果语法指针向量,但几乎没有成功。指针类型是不可复制的,因此使用它的规则必须接受一个引用:
#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。
关于如何使示例工作的任何想法?
llonesmiz在评论中回答了我的问题,所以我把他的内幕贴出来供将来参考。使用定制点转换属性,问题可以这样解决:
#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++无法正确复制指针
- 简单可复制与可简单复制
- 如何在C++中复制指针数组的数据
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 如何编写复制构造函数来复制指针?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 为什么 std::function 本身是可复制构造的类型?
- C++不可复制的 lambda 的行为是可复制的
- 复制指针,在不更改原始指针的情况下更改副本指向的内容?
- 如何使具有包含唯一指针的成员变量的类可复制可分配