1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <typeinfo> #include <cxxabi.h> // for demangle #include <stdlib.h> // for free #include <string> template <typename Super> class A : public Super { }; template <typename Super> class B : public Super { }; template <typename Super> class C : public Super { }; namespace SomeCrazyNamespace { template <typename Super> class SomeCrazyClassName : public Super { }; } class Blank { }; std::string getTemplateName(std::string arg) // won't work for classes nested inside template class, // this is just for sake of example { arg.resize(arg.find_first_of('<')); return arg; } void printTypeComponents(const Blank&) { std::cout << "composed of Blank\n"; } template <template <typename> class Q, typename T> void printTypeComponents(const Q<T>&) { int status; char* realname = abi::__cxa_demangle(typeid(Q<Blank>).name(), 0, 0, &status); std::cout << "composed of " << getTemplateName(realname) << '\n'; free(realname); printTypeComponents(T()); } int main() { typedef A<B<C<Blank> > > ComposedType; ComposedType ct; printTypeComponents(ct); std::cout << '\n'; typedef A<C<Blank> > ComposedType2; ComposedType2 ct2; printTypeComponents(ct2); std::cout << '\n'; typedef SomeCrazyNamespace::SomeCrazyClassName<A<Blank> > ComposedType3; ComposedType3 ct3; printTypeComponents(ct3); } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjeHhhYmkuaD4gLy8gZm9yIGRlbWFuZ2xlCiNpbmNsdWRlIDxzdGRsaWIuaD4gLy8gZm9yIGZyZWUKI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBTdXBlcj4KY2xhc3MgQSA6IHB1YmxpYyBTdXBlcgp7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgU3VwZXI+CmNsYXNzIEIgOiBwdWJsaWMgU3VwZXIKeyB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPgpjbGFzcyBDIDogcHVibGljIFN1cGVyCnsgfTsKCm5hbWVzcGFjZSBTb21lQ3JhenlOYW1lc3BhY2UgewoKdGVtcGxhdGUgPHR5cGVuYW1lIFN1cGVyPgpjbGFzcyBTb21lQ3JhenlDbGFzc05hbWUgOiBwdWJsaWMgU3VwZXIKeyB9OwoKfQoKY2xhc3MgQmxhbmsKeyB9OwoKc3RkOjpzdHJpbmcgZ2V0VGVtcGxhdGVOYW1lKHN0ZDo6c3RyaW5nIGFyZykKLy8gd29uJ3Qgd29yayBmb3IgY2xhc3NlcyBuZXN0ZWQgaW5zaWRlIHRlbXBsYXRlIGNsYXNzLAovLyB0aGlzIGlzIGp1c3QgZm9yIHNha2Ugb2YgZXhhbXBsZQp7CiAgYXJnLnJlc2l6ZShhcmcuZmluZF9maXJzdF9vZignPCcpKTsKICByZXR1cm4gYXJnOwp9Cgp2b2lkIHByaW50VHlwZUNvbXBvbmVudHMoY29uc3QgQmxhbmsmKQp7CiAgc3RkOjpjb3V0IDw8ICJjb21wb3NlZCBvZiBCbGFua1xuIjsKfQoKdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgUSwgdHlwZW5hbWUgVD4Kdm9pZCBwcmludFR5cGVDb21wb25lbnRzKGNvbnN0IFE8VD4mKQp7CiAgaW50IHN0YXR1czsKICBjaGFyKiByZWFsbmFtZSA9IGFiaTo6X19jeGFfZGVtYW5nbGUodHlwZWlkKFE8Qmxhbms+KS5uYW1lKCksIDAsIDAsICZzdGF0dXMpOwoKICBzdGQ6OmNvdXQgPDwgImNvbXBvc2VkIG9mICIgPDwgZ2V0VGVtcGxhdGVOYW1lKHJlYWxuYW1lKSA8PCAnXG4nOwogIGZyZWUocmVhbG5hbWUpOwogIAogIHByaW50VHlwZUNvbXBvbmVudHMoVCgpKTsKfQoKCmludCBtYWluKCkKewogIHR5cGVkZWYgQTxCPEM8Qmxhbms+ID4gPiBDb21wb3NlZFR5cGU7CiAgQ29tcG9zZWRUeXBlIGN0OwogIHByaW50VHlwZUNvbXBvbmVudHMoY3QpOwogIAogIHN0ZDo6Y291dCA8PCAnXG4nOwoKICB0eXBlZGVmIEE8QzxCbGFuaz4gPiBDb21wb3NlZFR5cGUyOwogIENvbXBvc2VkVHlwZTIgY3QyOwogIHByaW50VHlwZUNvbXBvbmVudHMoY3QyKTsKICAKICBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAKICB0eXBlZGVmIFNvbWVDcmF6eU5hbWVzcGFjZTo6U29tZUNyYXp5Q2xhc3NOYW1lPEE8Qmxhbms+ID4gQ29tcG9zZWRUeXBlMzsKICBDb21wb3NlZFR5cGUzIGN0MzsKICBwcmludFR5cGVDb21wb25lbnRzKGN0Myk7Cn0K
-
upload with new input
-
result: Success time: 0s memory: 2860 kB returned value: 0
composed of A composed of B composed of C composed of Blank composed of A composed of C composed of Blank composed of SomeCrazyNamespace::SomeCrazyClassName composed of A composed of Blank


