{"id":1658,"date":"2023-05-24T08:18:43","date_gmt":"2023-05-24T06:18:43","guid":{"rendered":"https:\/\/risc.web-email.at\/c20-concepts\/"},"modified":"2024-11-06T17:36:08","modified_gmt":"2024-11-06T16:36:08","slug":"technical-article-c20-concepts","status":"publish","type":"publication","link":"https:\/\/risc.web-email.at\/en\/technicalarticles\/technical-article-c20-concepts\/","title":{"rendered":"C++20 Concepts (EN)"},"content":{"rendered":"\n<h2 class=\"is-style-v2-telegrafico wp-block-heading\">A short historical overview about the development of the<br>programming language and the implementation of \u201cTemplates\u201d and \u201cConcepts.\u201d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">by Michael Hava, MSc<\/h3>\n\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<p><em>The famous Bjarne Stroustrup, the inventor of the programming language C++, which is still widely used today, originally started developing C with Classes in 1979 at Bell Labs. His goal was a programming language that would combine the speed of C with the organizational capabilities (=object orientation) of Simula which were and still are necessary for large projects.<\/em><br><br><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-media-text has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center\"><div class=\"wp-block-media-text__content\">\n<p><strong>Table of contents<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Algorithms are defined on algebraic structures<\/li>\n\n\n\n<li>No completion of Templates in sight<\/li>\n\n\n\n<li>First Concepts-based library<\/li>\n\n\n\n<li>Author<\/li>\n<\/ul>\n<\/div><figure class=\"wp-block-media-text__media\"><img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1-1024x576.jpg\" alt=\"Prorgamming\" class=\"wp-image-1640 size-full\" srcset=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1-1024x576.jpg 1024w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1-300x169.jpg 300w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1-768x432.jpg 768w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1-1536x864.jpg 1536w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-1194430859-1.jpg 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p>Due to the great success, Stroustrup began barely ten years later (1987) to work on an extension of the language, which in the meantime had been renamed C++: Templates &#8211; this generic concept was intended to enable the implementation of generic classes and functions, and thus incidentally to largely replace the pre-processor macros taken over from C. The development of these Templates was based essentially on three Design goals:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>full generality:<\/strong> templates should not be targeted at individual use cases, but should be designed for broad use.<\/li>\n\n\n\n<li><strong>zero overhead:<\/strong> Code generated by templates should be indistinguishable from handwritten code (in terms of efficiency, performance, etc.) after compilation.<\/li>\n\n\n\n<li><strong>good interfaces (\u201cconstraints\u201d):<\/strong> Similarly as C++ had improved the type security in relation to C, generic interfaces are to represent an improvement, too.<\/li>\n<\/ul>\n\n\n\n<p>Result of the work: It seems to be impossible to achieve all three goals at the same time at the current state of research. Since the first two goals are essential for the acceptance of templates, while constraints \u201conly\u201d improve usability, templates are added to C++ without them. Constraints are to be added as soon as possible.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-full is-style-default\"><img decoding=\"async\" width=\"306\" height=\"345\" sizes=\"(max-width: 306px) 100vw, 306px\" src=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/ISO_C_Logo.png\" alt=\"C++ Logo\" class=\"wp-image-1642\" srcset=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/ISO_C_Logo.png 306w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/ISO_C_Logo-266x300.png 266w\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<h3 class=\"wp-block-heading\">Algorithms are defined on algebraic structures<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<p>In the year 1994, C++ (now on its way to becoming an ISO standard) is extended by the Standard Template Library (STL), a library for generic algorithms and container classes. It is the result of Alexander Stepanov\u2018s nearly 20 years of research on generic programming and is fundamentally different from contemporary object-oriented approaches.<\/p>\n\n\n\n<p id=\"footnote-1-1\">At the beginning of this research his realization stood firm in 1976: <strong>algorithms are defined on algebraic structures<\/strong>. Based on the mathematical model of algebraic structures, he developed Concepts <a href=\"#footnote-1\">[1]<\/a>, the central pillar of generic programming. Analogous to algebraic structures, concepts describe the required operations and underlying mathematical axioms, which an algorithm places on the data to be processed. The goal of generic programming is to define algorithms based only on the minimum necessary concepts and thus make them usable for a variety of concrete types.<\/p>\n\n\n\n<p>After experiments in several programming languages (Scheme, Ada, \u2026) C++ is the first, which is expressive enough for generic programming Alexander Stepanov thought &#8211; even if the missing support for concepts makes complex emulations necessary. With the integration of the STL into the standard library, the idea of Concepts is also taken over in C++. From a programming language perspective, concepts are a formal representation of constraints. The focus for the completion of templates shifts subsequently to Concepts. Nevertheless, the first C++ ISO standard 1998 (C++98) appears without extensions of the template system, Concepts must be emulated further.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large is-style-rounded\"><img decoding=\"async\" width=\"1024\" height=\"683\" sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-1024x683.jpg\" alt=\"Computer Head\" class=\"wp-image-1428\" srcset=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-1024x683.jpg 1024w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-300x200.jpg 300w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-768x512.jpg 768w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-1536x1025.jpg 1536w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994.jpg 1920w\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<h3 class=\"wp-block-heading\">No completion of Templates in sight<\/h3>\n\n\n\n<p>In the first years after C++98, the standard committee focused on bug fixing and stabilization. Therefore, the development of Concepts did not pick up again until 2003 as part of the work on the next C++ standard (C++0x). Bjarne Stroustrup and Gabriel Dos Reis published a series of papers on a possible Concepts design. A research group at Indiana University also published their results in 2005. The two contrasting approaches gave rise to the joint C++0x Concepts design in 2006, which was incorporated into the working draft of the C++ standard in 2008.<\/p>\n\n\n\n<p>In the months that followed, however, some problems with the design became apparent. Since the completion of the new standard was already postponed several times and it can be assumed that the bug fixing will lead to further postponements, the standard committee removed Concepts from the working draft again in 2009. C++11 thus appeared 13 years after the first standard still without the completion of templates.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-large is-style-rounded\"><img decoding=\"async\" width=\"1024\" height=\"683\" sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930-1024x683.jpg\" alt=\"Progamming\" class=\"wp-image-1292\" srcset=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930-1024x683.jpg 1024w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930-300x200.jpg 300w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930-768x512.jpg 768w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930-1536x1025.jpg 1536w, https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-494345930.jpg 1920w\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<h3 class=\"wp-block-heading\">First Concepts-based library<\/h3>\n\n\n\n<p id=\"footnote-2-1\">While working on C++14, Bjarne Stroustrup, Gabriel Dos Reis and Andrew Sutton designed a new draft &#8211; Concepts Lite &#8211; based on the findings of C++0x Concepts in 2013. The key difference to the old approach: This time they focus on a \u201cminimal feature\u201d <a href=\"#footnote-2\">[2]<\/a>, which can be extended later if needed. The result of their work is published in 2015 as a Technical Specification (TS) <a href=\"#footnote-3\">[3]<\/a>.<\/p>\n\n\n\n<p id=\"footnote-3-1\">In summer 2017, four months after the completion of C++17, concepts based on the TS are integrated into the working draft for C++20. Together with the language extension, a library extension of pre-built basic Concepts is provided. This will be followed in 2018 by Ranges, the first Concepts-based library &#8211; it contains, among other things, the STL algorithms verified with Concepts. C++20 will be adopted in February 2020 and unanimously approved in September 2020.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<h3 class=\"wp-block-heading\">Footnotes<\/h3>\n\n\n\n<p id=\"footnote-1\"><a href=\"#footnote-1-1\">[1]<\/a>&nbsp;The implicit counterpart of generic programming to the explicit interfaces from object-oriented programming.<\/p>\n\n\n\n<p id=\"footnote-2\"><a href=\"#footnote-2-1\">[2]<\/a>&nbsp;For example, language resources on axioms and definition checks are missing, among other things.<\/p>\n\n\n\n<p id=\"footnote-3\"><a href=\"#footnote-3-1\">[3]<\/a>&nbsp;Independent ISO document that contains possible extensions for a standard. The goal is to get user feedback and to include a version of the content in an ISO standard.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<h3 class=\"wp-block-heading\">Contact<\/h3>\n\n\n\n<div class=\"wp-block-contact-form-7-contact-form-selector\">\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f663-o1\" lang=\"en-US\" dir=\"ltr\" data-wpcf7-id=\"663\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/en\/wp-json\/wp\/v2\/publication\/1658#wpcf7-f663-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Contact form\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"663\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.5\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"en_US\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f663-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/>\n<\/fieldset>\n<div class=\"form-row\">\n\t<div class=\"form-input\">\n\t\t<p><label class=\"sr-only\" for=\"your-name\">Your name <\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-name\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"your-name\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Name\" value=\"\" type=\"text\" name=\"your-name\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-input\">\n\t\t<p><label class=\"sr-only\" for=\"your-email\">Your email<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-email\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" id=\"your-email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"E-Mail\" value=\"\" type=\"email\" name=\"your-email\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n<\/div>\n<div class=\"form-row\">\n\t<div class=\"form-input\">\n\t\t<p><label class=\"sr-only\" for=\"your-company\">Company <\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-company\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"your-company\" aria-invalid=\"false\" placeholder=\"Unternehmen\" value=\"\" type=\"text\" name=\"your-company\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n\t<div class=\"form-input\">\n\t\t<p><label class=\"sr-only\" for=\"your-position\">Position<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-position\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" aria-invalid=\"false\" placeholder=\"Position\" value=\"\" type=\"text\" name=\"your-position\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n<\/div>\n<div class=\"form-row\">\n\t<div class=\"form-input\">\n\t\t<p><label class=\"sr-only\" for=\"your-subject\"> Subject <\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-subject\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" id=\"your-subject\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Thema\" value=\"\" type=\"text\" name=\"your-subject\" \/><\/span>\n\t\t<\/p>\n\t<\/div>\n<\/div>\n<p><span id=\"wpcf7-69de241dcf34b-wrapper\" class=\"wpcf7-form-control-wrap phone-95-wrap\" style=\"display:none !important; visibility:hidden !important;\"><label for=\"wpcf7-69de241dcf34b-field\" class=\"hp-message\">Please leave this field empty.<\/label><input id=\"wpcf7-69de241dcf34b-field\"  class=\"wpcf7-form-control wpcf7-text\" type=\"text\" name=\"phone-95\" value=\"\" size=\"40\" tabindex=\"-1\" autocomplete=\"new-password\" \/><\/span><br \/>\n<label class=\"sr-only\" for=\"your-message\"> Your message (optional)<\/label><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"your-message\"><textarea cols=\"40\" rows=\"10\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea\" id=\"your-message\" aria-invalid=\"false\" placeholder=\"Ihre Nachricht an uns\" name=\"your-message\"><\/textarea><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"hcap-cf7\">\t\t<input\n\t\t\t\ttype=\"hidden\"\n\t\t\t\tclass=\"hcaptcha-widget-id\"\n\t\t\t\tname=\"hcaptcha-widget-id\"\n\t\t\t\tvalue=\"eyJzb3VyY2UiOlsiY29udGFjdC1mb3JtLTdcL3dwLWNvbnRhY3QtZm9ybS03LnBocCJdLCJmb3JtX2lkIjo2NjN9-5cf29316f0fc31f5a29d11a228757560\">\n\t\t\t\t<span id=\"hcap_cf7-69de241dcfa624.98234076\" class=\"wpcf7-form-control h-captcha \"\n\t\t\tdata-sitekey=\"3a6a81c1-2b2e-4b2a-b1eb-d9446bc09afb\"\n\t\t\tdata-theme=\"light\"\n\t\t\tdata-size=\"normal\"\n\t\t\tdata-auto=\"false\"\n\t\t\tdata-ajax=\"false\"\n\t\t\tdata-force=\"false\">\n\t\t<\/span>\n\t\t<input type=\"hidden\" id=\"_wpnonce\" name=\"_wpnonce\" value=\"83fc09d92f\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/publication\/1658\" \/><\/span><input class=\"wpcf7-form-control wpcf7-submit has-spinner btn\" type=\"submit\" value=\"Senden\" \/>\n<\/p><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<h3 class=\"wp-block-heading\">Author<\/h3>\n\n\n<div class=\"contact-person\">\n      <picture>\n      \n      \n      \n      \n      <img decoding=\"async\" data-aos=\"fade-zoom-in\"\n           data-aos-offset=\"0\" class=\"w-full\" width=\"212\" height=\"293\"\n           src=\"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/mhava1-removebg-preview.png\"\n           alt=\"\">\n    <\/picture>\n    \n\n<h5 class=\"wp-block-heading\">Michael Hava, MSc<\/h5>\n\n\n\n<p>Senior Software Architect<\/p>\n\n  <\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"wp-block-group-container alignfull \">\n<div class=\"wp-block-group alignwide is-layout-constrained wp-block-group-is-layout-constrained\"><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>A brief historical overview of the development of the programming language and the implementation of &#8220;Templates&#8221; and &#8220;Concepts&#8221;.<\/p>\n","protected":false},"featured_media":1429,"template":"","publication-category":[53,49,32],"class_list":["post-1658","publication","type-publication","status-publish","has-post-thumbnail","hentry","publication-category-software-reengineering-en","publication-category-software-development","publication-category-softwareentwicklung"],"acf":[],"portrait_thumb_url":"https:\/\/risc.web-email.at\/app\/uploads\/2023\/06\/iStock-464478994-360x214.jpg","_links":{"self":[{"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/publication\/1658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/publication"}],"about":[{"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/types\/publication"}],"version-history":[{"count":7,"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/publication\/1658\/revisions"}],"predecessor-version":[{"id":4560,"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/publication\/1658\/revisions\/4560"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/media\/1429"}],"wp:attachment":[{"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/media?parent=1658"}],"wp:term":[{"taxonomy":"publication-category","embeddable":true,"href":"https:\/\/risc.web-email.at\/en\/wp-json\/wp\/v2\/publication-category?post=1658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}