我使用karma来生成大型结构的表示,但结构在生成过程中被复制。我不想认为他们需要,所以想知道如何避免它。避免使用属性发生器的属性副本
下方打印的快速例如“复制!”,作为目标结构也是在rule::generate
复制:
namespace karma = spirit::karma;
namespace phoenix = boost::phoenix;
struct foo
{
foo() { }
foo(foo const &other) { std::cout << "Copy!"; }
int f() const { return 42; }
};
std::string output;
typedef std::back_insert_iterator<std::string> iterator;
karma::rule< iterator, foo() > foo_rule =
karma::int_[ karma::_1 = phoenix::bind(&foo::f, karma::_val) ];
foo my_foo;
iterator it(output);
karma::generate(it, foo_rule, my_foo);
我可以通过声明foo_rule
的属性,通过参考停止复制:
karma::rule< iterator, foo &() > foo_rule
,但这不适用于载体[显然foo
因此是可复制的,但在矢量构建时可能便宜,但在生成时复制时价格昂贵:-)]
下面的例子打印'复制!'在生成期间五次(即,在向量ctor期间忽略拷贝);如果10倍的foo_rule
属性不是一个参考:
std::vector<foo> my_vec_foo(5);
karma::rule< iterator, std::vector<foo>() > vec_foo_rule = *foo_rule;
karma::generate(it, vec_foo_rule, my_vec_foo);
有两个规则采取的引用与升压1.47 VC的2008年也就是,不编译:
karma::rule< iterator, foo &() > foo_rule /* = ... */;
karma::rule< iterator, std::vector<foo> &() > vec_foo_rule /* = ... */;
我得到extract_from_container
用Attribute = std::vector<foo>
和Exposed=std::vector<foo> &
实例化。在extract_from.hpp的第131行,它试图形成Exposed const &
,并且编译器在创建引用参考时失败。
我觉得我错过了什么,所以任何指针将不胜感激!
+1:
输出。也许,你可以让它变得更加复制/可以被复制(现在没有精神知识的人可能不会让它运行)。我测试了我的答案,这篇文章包含了一个完整的最小样本。欢呼 – sehe