{"id":4141,"date":"2019-02-22T18:01:18","date_gmt":"2019-02-22T17:01:18","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=4141"},"modified":"2019-02-22T18:05:13","modified_gmt":"2019-02-22T17:05:13","slug":"c-guns-acpl-ownership-transfer","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=4141","title":{"rendered":"C+ Guns: ACPL ownership transfer"},"content":{"rendered":"<p><a href=\"https:\/\/sourceforge.net\/p\/acpl\/code\/ci\/master\/tree\/acpl\/acpllib\/include\/core\/util\/functional.hpp\"> <em>acpl::moveOwnership<\/em><\/a> bietet im Gegensatz zu <em>std::move<\/em> den Vorteil, dass ein move-from const Variablen einen Fehler zur Compilezeit erzeugt. <\/p>\n<p>Zwei Beispiele sollen ownership transfer verdeutlichen.<br \/>\nDaten in ein Type moven und dort speichern.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;core\/util\/functional.hpp&gt;\r\n\r\nstruct Node {};\r\nstruct Edge {};\r\nstruct Graph {\r\n    std::vector&lt;Node&gt; nodes;\r\n    std::vector&lt;Edge&gt; edges;\r\n\r\n    Graph(std::vector&lt;Node&gt;&amp;&amp; nodes, std::vector&lt;Edge&gt;&amp;&amp; edges) \r\n    : nodes(acpl::moveOwnership(nodes)), edges(acpl::moveOwnership(edges))\r\n    {\r\n    }\r\n};\r\n\r\nvoid func() {\r\n    std::vector&lt;Node&gt; nodes;\r\n    std::vector&lt;Edge&gt; edges;\r\n    \/\/ ... fill nodes and edges\r\n    \/\/ graph is the new ownership of nodes and data\r\n    Graph graph(acpl::moveOwnership(nodes), acpl::moveOwnership(edges));\r\n    assert(nodes.empty());\r\n    assert(edges.empty());\r\n}\r\n<\/pre>\n<p>Daten entweder kopieren oder durch eine Funktion moven.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;core\/util\/functional.hpp&gt;\r\n\r\ntemplate&lt;typename Container&gt;\r\ninline std::vector&lt;int&gt; copyOrMove(Container&amp;&amp; x) {\r\n    Container data2(std::forward&lt;Container&gt;(x));\r\n    return data2;\r\n}\r\n\r\nvoid func() {\r\n    std::vector&lt;int&gt; x {1,2,3};\r\n    std::vector&lt;int&gt; copy = copyOrMove(x);\r\n    assert(not x.empty());    \r\n    std::vector&lt;int&gt; moved = copyOrMove(acpl::moveOwnership(x));\r\n    assert(x.empty());    \r\n}\r\n<\/pre>\n<p>Move von const Variablen ist nicht m\u00f6glich, da die Variablen ge\u00e4ndert werden w\u00fcrden, was nicht m\u00f6glich ist, weil sie const sind.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nvoid func() {\r\n    const std::vector&lt;int&gt; x {1,2,3};\r\n    std::vector&lt;int&gt; moved = acpl::moveOwnership(x); \/\/ error: static assertion failed: Move from const variables dosent make sense\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>acpl::moveOwnership bietet im Gegensatz zu std::move den Vorteil, dass ein move-from const Variablen einen Fehler zur Compilezeit erzeugt. Zwei Beispiele sollen ownership transfer verdeutlichen. Daten in ein Type moven und dort speichern. #include &lt;core\/util\/functional.hpp&gt; struct Node {}; struct Edge {}; struct Graph { std::vector&lt;Node&gt; nodes; std::vector&lt;Edge&gt; edges; Graph(std::vector&lt;Node&gt;&amp;&amp; nodes, std::vector&lt;Edge&gt;&amp;&amp; edges) : nodes(acpl::moveOwnership(nodes)), edges(acpl::moveOwnership(edges)) { [&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-4141","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\/4141","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=4141"}],"version-history":[{"count":6,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4141\/revisions"}],"predecessor-version":[{"id":4147,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4141\/revisions\/4147"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4141"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}