カルマを使用して大きな構造体の表現を生成していますが、生成中に構造体がコピーされています。私は彼らがそうである必要はないと思うので、それを避ける方法を考えていました。
以下の簡単な例では、ターゲット構造体が にコピーされるため、"Copy!" が出力され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
s はコピー可能ですが、ベクター構築時にコピーするのは安価かもしれませんが、生成時にコピーするのは高価です:-)]
以下の例では、'Copy!' が出力されます。生成中に 5 回 (つまり、ベクトル ctor 中のコピーを無視します)。foo_rule
の属性が参照でない場合は 10 回:
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);
両方のルールで参照を取得すると、VC 2008 の Boost 1.47 でコンパイルされません。
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 &
refrence-to-reference を作成するときに、フォームを作成しようとしてコンパイラが失敗します。
私は何かが欠けているように感じるので、どんなポインタでも大歓迎です!