# t00008 - Template and template template relationships ## Config ```yaml compilation_database_dir: .. output_directory: puml diagrams: t00008_class: type: class glob: - ../../tests/t00008/t00008.cc using_namespace: - clanguml::t00008 include: namespaces: - clanguml::t00008 ``` ## Source code File t00008.cc ```cpp #include #include namespace clanguml { namespace t00008 { using CMP = bool (*)(const int, const int); template class A { public: T value; T *pointer; T &reference; std::vector

values; std::array ints; CMP comparator; }; template struct Vector { std::vector values; }; template typename C> struct B { C template_template; }; struct D { B ints; template D(std::tuple * /*items*/) { } void add(int i) { ints.template_template.values.push_back(i); } }; struct E { template struct nested_template { using DT = ET; static DT *get(ET *d) { return d; } }; }; template <> struct E::nested_template { using DeclType = char; static DeclType *getDecl(char *c) { return c; } }; } // namespace t00008 } // namespace clanguml ``` ## Generated UML diagrams ![t00008_class](./t00008_class.svg "Template and template template relationships") ## Generated JSON models ```json { "diagram_type": "class", "elements": [ { "bases": [], "display_name": "clanguml::t00008::A", "id": "2293517130897538130", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "value", "source_location": { "column": 7, "file": "../../tests/t00008/t00008.cc", "line": 11, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "T" }, { "access": "public", "is_static": false, "name": "pointer", "source_location": { "column": 8, "file": "../../tests/t00008/t00008.cc", "line": 12, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "T *" }, { "access": "public", "is_static": false, "name": "reference", "source_location": { "column": 8, "file": "../../tests/t00008/t00008.cc", "line": 13, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "T &" }, { "access": "public", "is_static": false, "name": "values", "source_location": { "column": 20, "file": "../../tests/t00008/t00008.cc", "line": 14, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "std::vector

" }, { "access": "public", "is_static": false, "name": "ints", "source_location": { "column": 24, "file": "../../tests/t00008/t00008.cc", "line": 15, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "std::array" }, { "access": "public", "is_static": false, "name": "comparator", "source_location": { "column": 9, "file": "../../tests/t00008/t00008.cc", "line": 17, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "CMP" } ], "methods": [], "name": "A", "namespace": "clanguml::t00008", "source_location": { "column": 71, "file": "../../tests/t00008/t00008.cc", "line": 9, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] }, { "default": "T", "is_variadic": false, "kind": "template_type", "name": "P", "template_parameters": [] }, { "default": "nullptr", "is_variadic": false, "kind": "non_type_template", "template_parameters": [], "type": "CMP" }, { "default": "3", "is_variadic": false, "kind": "non_type_template", "name": "N", "template_parameters": [], "type": "int" } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::Vector", "id": "1677407014842680311", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "values", "source_location": { "column": 20, "file": "../../tests/t00008/t00008.cc", "line": 21, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "std::vector" } ], "methods": [], "name": "Vector", "namespace": "clanguml::t00008", "source_location": { "column": 30, "file": "../../tests/t00008/t00008.cc", "line": 20, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::B>", "id": "1968575752686868237", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "template_template", "source_location": { "column": 10, "file": "../../tests/t00008/t00008.cc", "line": 25, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "C" } ], "methods": [], "name": "B", "namespace": "clanguml::t00008", "source_location": { "column": 62, "file": "../../tests/t00008/t00008.cc", "line": 24, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] }, { "is_variadic": false, "kind": "template_template_type", "name": "C<>", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::B", "id": "1449136415707203971", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "B", "namespace": "clanguml::t00008", "source_location": { "column": 62, "file": "../../tests/t00008/t00008.cc", "line": 24, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "int" }, { "is_variadic": false, "kind": "template_type", "name": "clanguml::t00008::Vector", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::D", "id": "1562396858816419857", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": false, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "ints", "source_location": { "column": 20, "file": "../../tests/t00008/t00008.cc", "line": 29, "translation_unit": "../../tests/t00008/t00008.cc" }, "type": "B" } ], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "add", "parameters": [ { "name": "i", "type": "int" } ], "type": "void" }, { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "D", "parameters": [ { "name": "", "type": "std::tuple *" } ], "type": "void" } ], "name": "D", "namespace": "clanguml::t00008", "source_location": { "column": 8, "file": "../../tests/t00008/t00008.cc", "line": 28, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::E", "id": "1787658457052431115", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": false, "is_union": false, "members": [], "methods": [], "name": "E", "namespace": "clanguml::t00008", "source_location": { "column": 8, "file": "../../tests/t00008/t00008.cc", "line": 36, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::E::nested_template", "id": "1549419203490064906", "is_abstract": false, "is_nested": true, "is_struct": true, "is_template": true, "is_union": false, "members": [], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": true, "is_virtual": false, "name": "get", "parameters": [ { "name": "d", "type": "ET *" } ], "type": "DT *" } ], "name": "E::nested_template", "namespace": "clanguml::t00008", "source_location": { "column": 35, "file": "../../tests/t00008/t00008.cc", "line": 37, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "ET", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00008::E::nested_template", "id": "33637089897037832", "is_abstract": false, "is_nested": true, "is_struct": true, "is_template": true, "is_union": false, "members": [], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": true, "is_virtual": false, "name": "getDecl", "parameters": [ { "name": "c", "type": "char *" } ], "type": "DeclType *" } ], "name": "E::nested_template", "namespace": "clanguml::t00008", "source_location": { "column": 23, "file": "../../tests/t00008/t00008.cc", "line": 44, "translation_unit": "../../tests/t00008/t00008.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "char" } ], "type": "class" } ], "metadata": { "clang_uml_version": "0.3.7-4-g43cc5cb", "llvm_version": "Ubuntu clang version 16.0.1 (++20230328073357+42d1b276f779-1~exp1~20230328073502.65)", "schema_version": 1 }, "name": "t00008_class", "relationships": [ { "access": "public", "destination": "1968575752686868237", "source": "1449136415707203971", "type": "instantiation" }, { "access": "public", "destination": "1449136415707203971", "label": "ints", "source": "1562396858816419857", "type": "aggregation" }, { "access": "public", "destination": "1787658457052431115", "source": "1549419203490064906", "type": "containment" }, { "access": "public", "destination": "1787658457052431115", "source": "33637089897037832", "type": "containment" }, { "access": "public", "destination": "1549419203490064906", "source": "33637089897037832", "type": "instantiation" } ], "using_namespace": "clanguml::t00008" } ```