{"id":17080,"date":"2024-06-11T11:32:58","date_gmt":"2024-06-11T09:32:58","guid":{"rendered":"https:\/\/www.kickmaker.fr\/blog\/?p=17080"},"modified":"2024-06-11T11:57:37","modified_gmt":"2024-06-11T09:57:37","slug":"policy-based-design-in-c-2","status":"publish","type":"post","link":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/","title":{"rendered":"Unlocking flexibility and reusability in C++ with policy-based design"},"content":{"rendered":"[vc_row type=&#8221;full_width_background&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; bg_color=&#8221;#ffffff&#8221; scene_position=&#8221;center&#8221; top_padding=&#8221;5%&#8221; bottom_padding=&#8221;10%&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;1&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221; gradient_type=&#8221;default&#8221; shape_type=&#8221;&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_row_inner column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; text_align=&#8221;left&#8221; row_position=&#8221;default&#8221; row_position_tablet=&#8221;inherit&#8221; row_position_phone=&#8221;inherit&#8221; overflow=&#8221;visible&#8221; pointer_events=&#8221;all&#8221;][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; overflow=&#8221;visible&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text text_direction=&#8221;default&#8221;]\n<h2 style=\"text-align: center;\"><strong>Engineer-tested hardware hacks: insider tips and trick<br \/>\n(By Kickmaker engineers)<\/strong><\/h2>\n[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text text_direction=&#8221;default&#8221;]<strong>In C++ library development, there are instances where problems require manipulating and combining many unique behaviors.<\/strong><\/p>\n<p>For example, in discrete space simulations, developers often need to consider performance. They must manage both the details of the matrix representation (e.g., dense, sparse) that affect space complexity and the algorithms that affect runtime performance.<\/p>\n<p>Additionally, if the developer needs to implement simulator activity logging (what information to log, when, and how), this adds a new set of behaviors that may or may not interact with the matrix behaviors.<\/p>\n<p><strong>A na\u00efve implementation could look like:<\/strong>[\/vc_column_text][image_with_animation image_url=&#8221;17085&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text text_direction=&#8221;default&#8221;]You can test the code on Compiler Explorer: <a href=\"https:\/\/godbolt.org\/z\/6MKa7vdKr\">https:\/\/godbolt.org\/z\/6MKa7vdKr<\/a>[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][vc_column_text text_direction=&#8221;default&#8221;]<strong>One code: numerous challenges<\/strong><\/p>\n<p>The most important one is that it does not respect the Open-Closed Principle. If a new type of matrix representation is needed, the developer would have to modify the existing code to accommodate it. This is undesirable: code should be open to extension but closed to modification.<\/p>\n<p>A second problem is that choice resolution happens at runtime, even if the decisions about which matrix and logging methods to use are made before compiling the program. This is suboptimal because the compiler cannot optimize the code as effectively without this information.<\/p>\n<p>A third problem is the scalability of this approach: long switch statements with several levels of indentation reduce readability. This is just the tip of the iceberg: if multiple sets of behaviors must interact, it leads to combinatorial explosion. For instance, with 3 different sets of behaviors (matrix representation, logging, and the type of data in the matrix), each with just 2 options, there are already 2^3=8 cases to manage, and it jumps to 27 if a third option is added. This complexity is undesirable.<\/p>\n<p>That\u2019s where Policy-Based Design shines, offering a lifeline.<\/p>\n<p>It allows us to create adaptable software components by separating orthogonal behaviors or strategies into distinct policy classes, adhering to the Single Responsibility Principle. Clients can mix and match these policies to inject customized behaviors without altering the core implementation, aligning perfectly with the Open-Closed Principle:[\/vc_column_text][image_with_animation image_url=&#8221;17090&#8243; image_size=&#8221;full&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221;][vc_column_text text_direction=&#8221;default&#8221;]Test the code on compiler explorer : <a href=\"https:\/\/godbolt.org\/z\/3PTb4bf7T\">https:\/\/godbolt.org\/z\/3PTb4bf7T<\/a>[\/vc_column_text][vc_column_text text_direction=&#8221;default&#8221;]As we can see, Policy-Based Design essentially acts as a compile-time version of the Strategy Pattern, offering advantages such as leveraging type information for safety checks and optimizations, and overcoming limitations like covariant return types.<\/p>\n<p>Although design choices often depend on personal style, project specifications, and time constraints, I personally enjoy using this design or one of its many flavors in my C++ projects. I appreciate its type safety and the simplicity and testability of each component.<\/p>\n<p>So think about it, and maybe in your next project, give yourself permission to embrace Policy-Based Design and unlock a world of compile-time flexibility and adaptability!<\/p>\n<p>Happy coding![\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221; overflow=&#8221;visible&#8221; overlay_strength=&#8221;0.3&#8243; gradient_direction=&#8221;left_to_right&#8221; shape_divider_position=&#8221;bottom&#8221; bg_image_animation=&#8221;none&#8221;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; column_position=&#8221;default&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/1&#8243; tablet_width_inherit=&#8221;default&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221;][divider line_type=&#8221;No Line&#8221; custom_height=&#8221;20&#8243;][vc_row_inner equal_height=&#8221;yes&#8221; content_placement=&#8221;middle&#8221; column_margin=&#8221;custom&#8221; column_margin_custom=&#8221;2%&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; top_padding_tablet=&#8221;7%&#8221; constrain_group_3=&#8221;yes&#8221; bottom_padding_tablet=&#8221;7%&#8221; top_padding_phone=&#8221;0&#8243; constrain_group_5=&#8221;yes&#8221; bottom_padding_phone=&#8221;0&#8243; text_align=&#8221;left&#8221; row_position=&#8221;default&#8221; row_position_tablet=&#8221;inherit&#8221; row_position_phone=&#8221;inherit&#8221; overflow=&#8221;visible&#8221; pointer_events=&#8221;all&#8221;][vc_column_inner left_padding_phone=&#8221;10%&#8221; constrain_group_105=&#8221;yes&#8221; right_padding_phone=&#8221;10%&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; overflow=&#8221;visible&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;1\/3&#8243; tablet_width_inherit=&#8221;small_desktop&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221; column_padding_type=&#8221;advanced&#8221; gradient_type=&#8221;default&#8221;][image_with_animation image_url=&#8221;17100&#8243; image_size=&#8221;large&#8221; animation_type=&#8221;entrance&#8221; animation=&#8221;None&#8221; animation_movement_type=&#8221;transform_y&#8221; hover_animation=&#8221;none&#8221; alignment=&#8221;&#8221; border_radius=&#8221;none&#8221; box_shadow=&#8221;none&#8221; image_loading=&#8221;default&#8221; max_width=&#8221;100%&#8221; max_width_mobile=&#8221;default&#8221; mask_enable=&#8221;true&#8221; mask_shape=&#8221;circle-rect&#8221; mask_size=&#8221;contain&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_tablet=&#8221;inherit&#8221; column_padding_phone=&#8221;inherit&#8221; column_padding_position=&#8221;all&#8221; column_element_direction_desktop=&#8221;default&#8221; column_element_spacing=&#8221;default&#8221; desktop_text_alignment=&#8221;default&#8221; tablet_text_alignment=&#8221;default&#8221; phone_text_alignment=&#8221;default&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; column_backdrop_filter=&#8221;none&#8221; column_shadow=&#8221;none&#8221; column_border_radius=&#8221;none&#8221; column_link_target=&#8221;_self&#8221; overflow=&#8221;visible&#8221; gradient_direction=&#8221;left_to_right&#8221; overlay_strength=&#8221;0.3&#8243; width=&#8221;2\/3&#8243; tablet_width_inherit=&#8221;small_desktop&#8221; animation_type=&#8221;default&#8221; bg_image_animation=&#8221;none&#8221; border_type=&#8221;simple&#8221; column_border_width=&#8221;none&#8221; column_border_style=&#8221;solid&#8221; column_padding_type=&#8221;default&#8221; gradient_type=&#8221;default&#8221;][nectar_badge display_tag=&#8221;label&#8221; badge_style=&#8221;default&#8221; bg_color_type=&#8221;global&#8221; color=&#8221;extra-color-1&#8243; text_color=&#8221;#ffffff&#8221; padding=&#8221;small&#8221; border_radius=&#8221;5px&#8221; display=&#8221;block&#8221; text=&#8221;Electronical&#8221; margin_bottom=&#8221;10&#8243;][nectar_responsive_text font_size_max=&#8221;32px&#8221; font_size_desktop=&#8221;2vw&#8221; font_line_height=&#8221;1.5&#8243; font_size_phone=&#8221;4.7vw&#8221; font_size_tablet=&#8221;2.5vw&#8221; text_direction=&#8221;default&#8221;]\n<h4>Arnaud, software engineer at <a href=\"https:\/\/www.kickmaker.fr\/en\/\">Kickmaker<\/a><\/h4>\n[\/nectar_responsive_text][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row]\n<noscript class=\"ninja-forms-noscript-message\">\n\tNotice: JavaScript is required for this content.<\/noscript>\n<div id=\"nf-form-3-cont\" class=\"nf-form-cont\" aria-live=\"polite\" aria-labelledby=\"nf-form-title-3\" aria-describedby=\"nf-form-errors-3\" role=\"form\">\n\n    <div class=\"nf-loading-spinner\"><\/div>\n\n<\/div>\n        <!-- That data is being printed as a workaround to page builders reordering the order of the scripts loaded-->\n        <script>var formDisplay=1;var nfForms=nfForms||[];var form=[];form.id='3';form.settings={\"objectType\":\"Form Setting\",\"editActive\":true,\"title\":\"Want to join us?\",\"show_title\":1,\"allow_public_link\":0,\"embed_form\":\"\",\"clear_complete\":1,\"hide_complete\":1,\"default_label_pos\":\"above\",\"wrapper_class\":\"\",\"element_class\":\"\",\"form_title_heading_level\":\"3\",\"key\":\"\",\"add_submit\":0,\"changeEmailErrorMsg\":\"Please enter a valid email address!\",\"changeDateErrorMsg\":\"Please enter a valid date!\",\"confirmFieldErrorMsg\":\"These fields must match!\",\"fieldNumberNumMinError\":\"Number Min Error\",\"fieldNumberNumMaxError\":\"Number Max Error\",\"fieldNumberIncrementBy\":\"Please increment by \",\"formErrorsCorrectErrors\":\"Please correct errors before submitting this form.\",\"validateRequiredField\":\"This is a required field.\",\"honeypotHoneypotError\":\"Honeypot Error\",\"fieldsMarkedRequired\":\"Field marked with an * are required.\",\"currency\":\"\",\"unique_field_error\":\"A form with this value has already been submitted.\",\"logged_in\":false,\"not_logged_in_msg\":\"\",\"sub_limit_msg\":\"The form has reached its submission limit.\",\"calculations\":[],\"formContentData\":[\"firstname_1715078944743\",\"lastname_1715078948533\",\"email_1715078950540\",\"phone_1715078954030\",\"linkedin_link_1715078987470\",\"submit_1715079013577\"],\"drawerDisabled\":false,\"objectDomain\":\"display\",\"ninjaForms\":\"Ninja Forms\",\"fieldTextareaRTEInsertLink\":\"Insert Link\",\"fieldTextareaRTEInsertMedia\":\"Insert Media\",\"fieldTextareaRTESelectAFile\":\"Select a file\",\"tableInsertRowAbove\":\"Insert Row Above\",\"tableInsertRowBelow\":\"Insert Row Below\",\"tableInsertColumnLeft\":\"Insert Column Left\",\"tableInsertColumnRight\":\"Insert Column Right\",\"tableDeleteRow\":\"Delete Row\",\"tableDeleteColumn\":\"Delete Column\",\"tableDeleteTable\":\"Delete Table\",\"tableLegacyNotice\":\"This content has tables in the old editor format. Custom styles are preserved until converted. Editing will update to the new format.\",\"tableLegacyConvert\":\"Convert Now\",\"tableInsertTable\":\"Insert Table\",\"dismiss\":\"Dismiss\",\"insertLink\":\"Insert Link\",\"formHoneypot\":\"If you are a human seeing this field, please leave it empty.\",\"fileUploadOldCodeFileUploadInProgress\":\"File Upload in Progress.\",\"fileUploadOldCodeFileUpload\":\"FILE UPLOAD\",\"currencySymbol\":false,\"thousands_sep\":\",\",\"decimal_point\":\".\",\"siteLocale\":\"en_US\",\"dateFormat\":\"m\\\/d\\\/Y\",\"startOfWeek\":\"1\",\"of\":\"of\",\"previousMonth\":\"Previous Month\",\"nextMonth\":\"Next Month\",\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"monthsShort\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\"weekdays\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"weekdaysShort\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"weekdaysMin\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"recaptchaConsentMissing\":\"reCaptcha validation couldn&#039;t load.\",\"recaptchaMissingCookie\":\"reCaptcha v3 validation couldn&#039;t load the cookie needed to submit the form.\",\"recaptchaConsentEvent\":\"Accept reCaptcha cookies before sending the form.\",\"currency_symbol\":\"\",\"beforeForm\":\"\",\"beforeFields\":\"\",\"afterFields\":\"\",\"afterForm\":\"\"};form.fields=[{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":1,\"idAttribute\":\"id\",\"type\":\"firstname\",\"label\":\"First Name\",\"key\":\"firstname_1715078944743\",\"label_pos\":\"above\",\"required\":false,\"default\":\"\",\"placeholder\":\"\",\"container_class\":\"\",\"element_class\":\"\",\"admin_label\":\"\",\"help_text\":\"\",\"custom_name_attribute\":\"fname\",\"personally_identifiable\":1,\"value\":\"\",\"id\":9,\"beforeField\":\"\",\"afterField\":\"\",\"parentType\":\"firstname\",\"element_templates\":[\"firstname\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":2,\"idAttribute\":\"id\",\"type\":\"lastname\",\"label\":\"Last Name\",\"key\":\"lastname_1715078948533\",\"label_pos\":\"above\",\"required\":1,\"default\":\"\",\"placeholder\":\"\",\"container_class\":\"\",\"element_class\":\"\",\"admin_label\":\"\",\"help_text\":\"\",\"custom_name_attribute\":\"lname\",\"personally_identifiable\":1,\"value\":\"\",\"drawerDisabled\":false,\"id\":10,\"beforeField\":\"\",\"afterField\":\"\",\"parentType\":\"lastname\",\"element_templates\":[\"lastname\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":3,\"idAttribute\":\"id\",\"type\":\"email\",\"label\":\"Email\",\"key\":\"email_1715078950540\",\"label_pos\":\"above\",\"required\":1,\"default\":\"\",\"placeholder\":\"\",\"container_class\":\"\",\"element_class\":\"\",\"admin_label\":\"\",\"help_text\":\"\",\"custom_name_attribute\":\"email\",\"personally_identifiable\":1,\"value\":\"\",\"drawerDisabled\":false,\"id\":11,\"beforeField\":\"\",\"afterField\":\"\",\"parentType\":\"email\",\"element_templates\":[\"email\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":4,\"idAttribute\":\"id\",\"type\":\"phone\",\"label\":\"Phone\",\"key\":\"phone_1715078954030\",\"label_pos\":\"above\",\"required\":false,\"default\":\"\",\"placeholder\":\"\",\"container_class\":\"\",\"element_class\":\"\",\"input_limit\":\"\",\"input_limit_type\":\"characters\",\"input_limit_msg\":\"Character(s) left\",\"manual_key\":false,\"admin_label\":\"\",\"help_text\":\"\",\"mask\":\"\",\"custom_mask\":\"\",\"custom_name_attribute\":\"phone\",\"personally_identifiable\":1,\"value\":\"\",\"id\":12,\"beforeField\":\"\",\"afterField\":\"\",\"parentType\":\"textbox\",\"element_templates\":[\"tel\",\"textbox\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":5,\"idAttribute\":\"id\",\"type\":\"textbox\",\"label\":\"LinkedIn link\",\"key\":\"linkedin_link_1715078987470\",\"label_pos\":\"above\",\"required\":1,\"default\":\"\",\"placeholder\":\"\",\"container_class\":\"\",\"element_class\":\"\",\"input_limit\":\"\",\"input_limit_type\":\"characters\",\"input_limit_msg\":\"Character(s) left\",\"manual_key\":false,\"admin_label\":\"\",\"help_text\":\"\",\"mask\":\"\",\"custom_mask\":\"\",\"custom_name_attribute\":\"\",\"personally_identifiable\":\"\",\"value\":\"\",\"drawerDisabled\":false,\"id\":13,\"beforeField\":\"\",\"afterField\":\"\",\"parentType\":\"textbox\",\"element_templates\":[\"textbox\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":false,\"order\":6,\"idAttribute\":\"id\",\"type\":\"submit\",\"label\":\"Submit\",\"processing_label\":\"Processing\",\"container_class\":\"\",\"element_class\":\"\",\"key\":\"submit_1715079013577\",\"admin_label\":\"\",\"id\":14,\"beforeField\":\"\",\"afterField\":\"\",\"value\":\"\",\"label_pos\":\"above\",\"parentType\":\"textbox\",\"element_templates\":[\"submit\",\"button\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap-no-label\"}];nfForms.push(form);<\/script>\n        ","protected":false},"excerpt":{"rendered":"<p>[vc_row type=&#8221;full_width_background&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; bg_color=&#8221;#ffffff&#8221; scene_position=&#8221;center&#8221; top_padding=&#8221;5%&#8221; bottom_padding=&#8221;10%&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221;&#8230;<\/p>\n","protected":false},"author":2,"featured_media":17103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[311,346],"tags":[364,390,352],"class_list":{"0":"post-17080","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-article-en","8":"category-hardware-tips-en","9":"tag-c","10":"tag-policy-based-design","11":"tag-software-en"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker\" \/>\n<meta property=\"og:description\" content=\"[vc_row type=&#8221;full_width_background&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; bg_color=&#8221;#ffffff&#8221; scene_position=&#8221;center&#8221; top_padding=&#8221;5%&#8221; bottom_padding=&#8221;10%&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221;...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Kickmaker\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-11T09:32:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-11T09:57:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"757\" \/>\n\t<meta property=\"og:image:height\" content=\"571\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Alys\u00e9e Flaut\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alys\u00e9e Flaut\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/\"},\"author\":{\"name\":\"Alys\u00e9e Flaut\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/#\\\/schema\\\/person\\\/04615529c56f5e2bbf8802761d9a884e\"},\"headline\":\"Unlocking flexibility and reusability in C++ with policy-based design\",\"datePublished\":\"2024-06-11T09:32:58+00:00\",\"dateModified\":\"2024-06-11T09:57:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/\"},\"wordCount\":1757,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/policy-based-design-C-Kickmaker-3.jpg\",\"keywords\":[\"C++\",\"policy based design\",\"software\"],\"articleSection\":[\"Article\",\"Hardware tips\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/\",\"url\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/\",\"name\":\"Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/policy-based-design-C-Kickmaker-3.jpg\",\"datePublished\":\"2024-06-11T09:32:58+00:00\",\"dateModified\":\"2024-06-11T09:57:37+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/#\\\/schema\\\/person\\\/04615529c56f5e2bbf8802761d9a884e\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/policy-based-design-C-Kickmaker-3.jpg\",\"contentUrl\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/policy-based-design-C-Kickmaker-3.jpg\",\"width\":757,\"height\":571,\"caption\":\"Policy based design hardware tips\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/policy-based-design-in-c-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unlocking flexibility and reusability in C++ with policy-based design\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/\",\"name\":\"Kickmaker\",\"description\":\"Hightech product industrialization brain food\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/#\\\/schema\\\/person\\\/04615529c56f5e2bbf8802761d9a884e\",\"name\":\"Alys\u00e9e Flaut\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g\",\"caption\":\"Alys\u00e9e Flaut\"},\"url\":\"https:\\\/\\\/www.kickmaker.fr\\\/blog\\\/author\\\/alysee\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/","og_locale":"en_US","og_type":"article","og_title":"Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker","og_description":"[vc_row type=&#8221;full_width_background&#8221; full_screen_row_position=&#8221;middle&#8221; column_margin=&#8221;default&#8221; column_direction=&#8221;default&#8221; column_direction_tablet=&#8221;default&#8221; column_direction_phone=&#8221;default&#8221; bg_color=&#8221;#ffffff&#8221; scene_position=&#8221;center&#8221; top_padding=&#8221;5%&#8221; bottom_padding=&#8221;10%&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; row_border_radius=&#8221;none&#8221; row_border_radius_applies=&#8221;bg&#8221;...","og_url":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/","og_site_name":"Kickmaker","article_published_time":"2024-06-11T09:32:58+00:00","article_modified_time":"2024-06-11T09:57:37+00:00","og_image":[{"width":757,"height":571,"url":"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg","type":"image\/jpeg"}],"author":"Alys\u00e9e Flaut","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Alys\u00e9e Flaut","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#article","isPartOf":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/"},"author":{"name":"Alys\u00e9e Flaut","@id":"https:\/\/www.kickmaker.fr\/blog\/#\/schema\/person\/04615529c56f5e2bbf8802761d9a884e"},"headline":"Unlocking flexibility and reusability in C++ with policy-based design","datePublished":"2024-06-11T09:32:58+00:00","dateModified":"2024-06-11T09:57:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/"},"wordCount":1757,"commentCount":0,"image":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg","keywords":["C++","policy based design","software"],"articleSection":["Article","Hardware tips"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/","url":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/","name":"Unlocking flexibility and reusability in C++ with policy-based design - Kickmaker","isPartOf":{"@id":"https:\/\/www.kickmaker.fr\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#primaryimage"},"image":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg","datePublished":"2024-06-11T09:32:58+00:00","dateModified":"2024-06-11T09:57:37+00:00","author":{"@id":"https:\/\/www.kickmaker.fr\/blog\/#\/schema\/person\/04615529c56f5e2bbf8802761d9a884e"},"breadcrumb":{"@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#primaryimage","url":"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg","contentUrl":"https:\/\/www.kickmaker.fr\/blog\/wp-content\/uploads\/2024\/06\/policy-based-design-C-Kickmaker-3.jpg","width":757,"height":571,"caption":"Policy based design hardware tips"},{"@type":"BreadcrumbList","@id":"https:\/\/www.kickmaker.fr\/blog\/policy-based-design-in-c-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.kickmaker.fr\/blog\/"},{"@type":"ListItem","position":2,"name":"Unlocking flexibility and reusability in C++ with policy-based design"}]},{"@type":"WebSite","@id":"https:\/\/www.kickmaker.fr\/blog\/#website","url":"https:\/\/www.kickmaker.fr\/blog\/","name":"Kickmaker","description":"Hightech product industrialization brain food","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kickmaker.fr\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.kickmaker.fr\/blog\/#\/schema\/person\/04615529c56f5e2bbf8802761d9a884e","name":"Alys\u00e9e Flaut","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/aaa717f85056a19d443e6750dfad64414b9a59742ead9e7e378f13cb07bb453d?s=96&d=mm&r=g","caption":"Alys\u00e9e Flaut"},"url":"https:\/\/www.kickmaker.fr\/blog\/author\/alysee\/"}]}},"_links":{"self":[{"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/posts\/17080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/comments?post=17080"}],"version-history":[{"count":9,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/posts\/17080\/revisions"}],"predecessor-version":[{"id":17096,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/posts\/17080\/revisions\/17096"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/media\/17103"}],"wp:attachment":[{"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/media?parent=17080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/categories?post=17080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kickmaker.fr\/blog\/wp-json\/wp\/v2\/tags?post=17080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}