Büyük yapıların temsillerini oluşturmak için karma kullanıyorum, ancak yapıları üretim sırasında kopyalanıyor. Ben düşünün düşünmek zorundalar, bu yüzden nasıl önleneceğini merak ediyordum.Karma jeneratörler ile öznitelik kopyalarından kaçınmak
baskılar altında kısa örneği "Kopyala", hedef yapı rule::generate
kopyalanan gibi: Ben referans olarak foo_rule
'ın niteliği bildirerek kopyasını durdurabilir
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);
:
karma::rule< iterator, foo &() > foo_rule
ama bu bir vektör ile çalışmaz [açıkçası foo
s bu yüzden kopyalanabilir, ancak vektör inşaat kopyalamak için ucuz olabilir, ancak üretmek için zaman pahalı kopyalamak :-)]
Aşağıdaki örnek 'Kopyala!' Yazdırır. üretim sırasında beş kez (yani, vektör cetveli sırasında kopyaları göz ardı ederek);
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);
iki kural ile, olan VC 2008 tarihinde Boost 1.47 ile derleme değil referansları almak Having:
karma::rule< iterator, foo &() > foo_rule /* = ... */;
karma::rule< iterator, std::vector<foo> &() > vec_foo_rule /* = ... */;
alıyorum foo_rule
'ın nitelik başvuru değilse 10 kat halinde extract_from_container
, Attribute = std::vector<foo>
ve Exposed=std::vector<foo> &
ile başlatılmıştır. Extract_from.hpp'nin 131'inci satırında, Exposed const &
'u oluşturmaya çalışır ve referansa yeniden referans oluştururken derleyici başarısız olur.
Bir şeyleri özlüyorum gibi hissediyorum, bu yüzden herhangi bir işaretçi büyük takdir edilecektir!
+1 mükemmel minimal sorun için kod ve çıktıda uyarı BÜYÜK MEKTUP bakın. Belki daha fazla kopya/pastable yapabilirdiniz (şu anda Ruh'un samimi bilgisi olmayan insanlar muhtemelen koşmayacaklardır). Cevabımı test ettim ve yazı tam bir minimum örnek içeriyor. Alkışlar – sehe