{"id":3231,"date":"2017-09-24T11:54:52","date_gmt":"2017-09-24T10:54:52","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3231"},"modified":"2017-09-24T11:54:52","modified_gmt":"2017-09-24T10:54:52","slug":"c-guns-settings-class","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3231","title":{"rendered":"C++ Guns - Settings class"},"content":{"rendered":"<p>F\u00fcr das n\u00e4chste gro\u00dfe Projekt will ich Einstellungen aus einer Datei lesen und in Performance kritischen Codeabschnitt nutzen.<br \/>\nDie Variablen sollen read-only, also const, sein. So wird ein versehentlichen ver\u00e4ndern der Einstellungen verhindert und der Compileroptimierer freut sich auch.  Auf getter-Funktionen m\u00f6chte ich wegen unn\u00f6tigen Code verzichten.<br \/>\nWenige Variablen werden besonders h\u00e4ufig benutzt, daher soll keine zus\u00e4tzliche Tipparbeit entstehen, um erst auf das Einstellungs-Objekt zuzugreifen, und dann auf die eigentliche Variable. Statt <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">if(settings.L1)<\/pre>\n<p> einfach gleich<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">if(L1)<\/pre>\n<p>Also wird es Shortcut Variablen geben.<br \/>\nUm die Lesbarkeit des performance kritischen Codes nicht zu verschlechtern, sollen einige Einstellungs Variablen zur Compilezeit ausgewertet werden, aber erst zur Laufzeit gesetzt. Dies gelingt mittels Code Vervielf\u00e4ltigung. Der Compiler erstellt f\u00fcr jede Variante speziell optimierten Code.<\/p>\n<p>Erste Implementierung:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef __cpp_if_constexpr\r\n    #error &quot;You need an actual C++17 compiler with feature P0292R2 'constexpr if' for this example&quot;\r\n#endif\r\n\r\n#include &lt;iostream&gt;\r\n\r\nusing namespace std;\r\n\r\nstruct Settings {\r\n    bool L1 = false;\r\n    bool L2 = false;\r\n};\r\n\r\ntemplate&lt;bool L2&gt;\r\nclass Algo {\r\npublic:\r\n    Algo(const Settings&amp; s)\r\n        : s(s)\r\n    {\r\n    }\r\n\r\n    void run() {\r\n        cout &lt;&lt; &quot;SWE Settings:\\n&quot;;\r\n        cout &lt;&lt; &quot;L1          &quot; &lt;&lt; s.L1 &lt;&lt; &quot;\\n&quot;;\r\n        cout &lt;&lt; &quot;shortcut L1 &quot; &lt;&lt; L1   &lt;&lt; &quot;\\n&quot;;\r\n        cout &lt;&lt; &quot;L2          &quot; &lt;&lt; s.L2 &lt;&lt; &quot;\\n&quot;;\r\n        \/\/ s.L2 = true; \/\/ error. read only\r\n\r\n        if constexpr(L2) {\r\n            cout &lt;&lt; &quot;L2 template &quot; &lt;&lt; L2   &lt;&lt; &quot;\\n&quot;;\r\n        } else {\r\n            cout &lt;&lt; &quot;L2 template &quot; &lt;&lt; L2   &lt;&lt; &quot;\\n&quot;;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    const Settings s;\r\n    const bool L1 = s.L1;\r\n};\r\n\r\n\r\nSettings readSettings() {\r\n    Settings s;\r\n    s.L1 = true;\r\n    return s;\r\n}\r\n\r\ntemplate&lt;bool L2&gt;\r\nvoid func(const Settings&amp; s) {\r\n    Algo&lt;L2&gt; swe(s);\r\n    swe.run();\r\n}\r\n\r\nint main() {\r\n    cout &lt;&lt; boolalpha;\r\n\r\n    Settings s = readSettings();\r\n\r\n    cout &lt;&lt; &quot;Runtime L2 setting: &quot; &lt;&lt; s.L2 &lt;&lt; &quot;\\n&quot;;\r\n    if(s.L2) {\r\n        func&lt;true&gt;(s);\r\n    } else {\r\n        func&lt;false&gt;(s);\r\n    }\r\n\r\n    s.L2 = !s.L2;\r\n    cout &lt;&lt; &quot;\\nRuntime L2 setting: &quot; &lt;&lt; s.L2 &lt;&lt; &quot;\\n&quot;;\r\n    if(s.L2) {\r\n        func&lt;true&gt;(s);\r\n    } else {\r\n        func&lt;false&gt;(s);\r\n    }\r\n}\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr das n\u00e4chste gro\u00dfe Projekt will ich Einstellungen aus einer Datei lesen und in Performance kritischen Codeabschnitt nutzen. Die Variablen sollen read-only, also const, sein. So wird ein versehentlichen ver\u00e4ndern der Einstellungen verhindert und der Compileroptimierer freut sich auch. Auf getter-Funktionen m\u00f6chte ich wegen unn\u00f6tigen Code verzichten. Wenige Variablen werden besonders h\u00e4ufig benutzt, daher soll [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3231","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3231"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3231\/revisions"}],"predecessor-version":[{"id":3238,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3231\/revisions\/3238"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3231"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}