C ++ iteriert mit boost fusion adapt_struct in das verschachtelte Strukturfeld

ZweiPaketüberfluss Antworten Schlagen Sie den Ansatz mit fusion adapt_struct vor, um über struct-Felder zu iterieren. Der Ansatz sieht gut aus. Wie iterieren Sie jedoch in ein Feld, das selbst eine Struktur ist?

Nach den vorherigen Antworten habe ich den folgenden Code gefunden. Das Problem liegt in der Klausel "#if 0", die der Code nicht kompiliert. Als alternative Lösung habe ich die Funktion "decode ()" erstellt, um einen ungültigen Zeiger auf das Zielargument zu setzen. Das funktioniert, verliert aber die Typinformationen beim Kompilieren. Gibt es eine bessere Lösung?

struct Foo_s { int i; };
BOOST_FUSION_ADAPT_STRUCT( Foo_s,  (int, i) )

struct Bar_s { int v; Foo_s w; };
BOOST_FUSION_ADAPT_STRUCT( Bar_s, (int, v)  (Foo_s, w) )

struct AppendToTextBox {
    template <typename T> void operator()(T& t) const {
        int status = 0;
        const char *realname = abi::__cxa_demangle(typeid(t).name(), 0, 0, &status);
        printf("  typename: %s  value: %s  realname: %s\n", typeid(t).name(),
               boost::lexical_cast<std::string>(t).c_str(), realname);
        std::string rn(realname);
        if ( rn.rfind("_s") == rn.size()-2 ) {
#if 0 /* this can not compile */
            for_each(t, AppendToTextBox());
#else
            decode(&t, rn);
#endif
        }
    }
};

void decode(void *f, std::string & intype ) {
    if ( intype.find("Foo_s") == 0 ) 
        for_each( *(Foo_s *)f, AppendToTextBox());
};

int main(int argc, char *argv[]) {
  Bar_s f = { 2, { 3 } };
  for_each(f, AppendToTextBox());
  return 0;
}

Ich habe weitergesehenWikipedia Anstatt eine Typzeichenfolge "intype" zu übergeben, können Sie typeid und dynamic_cast verwenden. Dies wird jedoch nur eine geringfügige Verbesserung sein. Ich bin auf der Suche nach einer Lösung, die eher mit C ++ zu tun hat oder das Sprachdesign verbessert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage