Два qaru.site/info/21935/... предлагают использовать метод fusion adapt_struct для перебора полей структуры. Подход выглядит неплохо. Однако как вы перебираете поле, которое является структурой?
Следуя предыдущим ответам, я придумал код ниже. Проблема заключается в условии "#if 0", код не компилируется. В качестве альтернативного решения я создал функцию "decode()", чтобы принять указатель void на целевой аргумент. Это работает, но теряет информацию о типе во время компиляции. Есть ли лучшее решение?
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;
}
Я видел на wikipedia вместо передачи строки типа "intype" вы можете использовать typeid и dynamic_cast. Но это будет лишь незначительное улучшение. Я ищу решение, более подходящее для С++ или форсированного языкового дизайна.