/* broken, i don't understand c++ templates */ #include #include #include #include #include #include #include using namespace std; struct El { variant>, int> v; template El(T v) { this->v = v; } void print() { if (holds_alternative(v)) { cout << get(v); } else { cout << "["; for (auto &e : *get>>(v)) { e.print(); cout << ","; } cout << "]"; } } }; El parse(istream &s) { char c = s.get(); if (c == '[') { auto v = make_unique>(); for (;;) { v->push_back(parse(s)); do { c = s.get(); } while (isspace(c)); if (c == ']') break; if (c != ',') throw invalid_argument("array sep"); } return El(move(v)); } if (isdigit(c)) { int v; s.putback(c); s >> v; return El(v); } throw invalid_argument("unexpected char"); } int main() { El a = parse(cin); a.print(); }