Ich versuche zu verstehen a program demonstrating boost/spirit.Das Parsen von Konstruktorinitialisierer für Vorlage verstehen
Im folgenden Template-Definition:
template <typename Iterator>
struct roman : qi::grammar<Iterator,unsigned()> {
roman() : roman::base_type(start)
{
using qi::eps;
using qi::lit;
using qi::_val;
using qi::_1;
using ascii::char_;
start = eps[_val = 0] >>
(
+lit('M')[_val += 1000]
|| hundreds[_val += _1]
|| tens[_val += _1]
|| ones[_val += _1]
)
;
}
qi::rule<Iterator,unsigned()> start;
};
Ich versuche, die Bedeutung von : roman::base_type(start)
zu verstehen.
- Ich nehme an, es ist ein constructor initializer.
- Außerdem gehe ich davon aus, dass es sich um eine member initializer list und
- , dass das Mitglied-initializer
roman::base_type(start)
eine Basis vonroman
base_type
- die eigentlich für
grammar<Iterator, T1, T2, T3, T4>
aus demroman
erbt eintypedef
aufgerufen initialisiert.
- , dass das Mitglied-initializer
Was ich nicht verstehe ist, wie es mit start
initialisiert werden kann, wenn start
Mitglied von roman
ist, die abgeleitete Klasse wir konstruieren noch?
Möglicherweise benötigt der Basisklassenkonstruktor nur einen Verweis auf ein 'qi: rule <>' -Objekt, um daran zu binden, und verwendet es nicht sofort? Dann kann der Konstruktor das 'start'-Memberobjekt initialisieren, so dass es für die Verwendung bereit ist, wenn die Basisklasse es benötigt. – CiaPan
@CiaPan Ja, das stimmt, der Konstruktor nimmt nur eine Referenz: 'Grammatik (Regel const &, std :: Zeichenkette const & =" unbenannte-Grammatik ")'. Also sind die Adressen der abgeleiteten Mitglieder bereit, als Referenz genommen zu werden, während die Basen noch initialisiert werden? –
wally
Ja. Das Objekt wird zuerst zugewiesen, dann konstruiert, so dass während der 'roman()' -Konstruktor-Prolog-Ausführung das 'start'-Element bereits zugewiesen ist, daher ist der Verweis darauf schon bekannt. Die Funktionen können sie übergeben und sicher speichern, sofern sie nicht versuchen, sie zu dereferenzieren (verwenden Sie das Objekt tatsächlich). – CiaPan