{"id":2429,"date":"2015-10-27T18:18:02","date_gmt":"2015-10-27T17:18:02","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=2429"},"modified":"2015-10-27T18:27:02","modified_gmt":"2015-10-27T17:27:02","slug":"enum-array-replacement-some-kind-of","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=2429","title":{"rendered":"Enum Array replacement - some kind of"},"content":{"rendered":"<p>Type safe enum class replace with normal class.<br \/>\nUsed as an index (key) type for continuous containers like std::vector \/ std::array instead of std::map etc.<\/p>\n<p>Pro: Fun.<br \/>\nCon: dynamic indice. myEnumIdx.somedata = 100000; can blow up the hole thing.<\/p>\n<p>For static enum array see<br \/>\n<a href=\"http:\/\/fcppt.org\/da\/dcf\/classfcppt_1_1container_1_1enum__array.html#af01f0518d2f63f4fd47eb5c510855c63\">http:\/\/fcppt.org\/da\/dcf\/classfcppt_1_1container_1_1enum__array.html#af01f0518d2f63f4fd47eb5c510855c63<\/a><br \/>\n<a href=\"http:\/\/fcppt.org\/d6\/ddd\/group__fcpptenum.html\">http:\/\/fcppt.org\/d6\/ddd\/group__fcpptenum.html<\/a><\/p>\n<pre><code>\r\n#include &lt;vector>\r\n\r\ntemplate&lt;typename Key, typename Value>\r\nclass EnumArray {\r\npublic:\r\n    \r\n    Value & operator[](const Key& key) {\r\n        return data[key];\r\n    }\r\n    \r\nprivate:\r\n    std::vector&lt;Value> data;\r\n};\r\n\r\nclass EnumType {\r\npublic:\r\n    int someData = 0;\r\n    \r\nprivate:\r\n    operator int() const {\r\n        return someData;\r\n    }\r\n    \r\n    template&lt;typename EnumType, typename>\r\n    friend class EnumArray;\r\n};\r\n\r\nclass EnumType2 {\r\npublic:\r\n    int someData = 0;\r\n    \r\nprivate:\r\n    operator int() const {\r\n        return someData;\r\n    }\r\n    \r\n    template&lt;typename EnumType2, typename>\r\n    friend class EnumArray;\r\n};\r\n\r\nvoid testfunc() {\r\n    EnumType myEnumIdx;\r\n    \r\n    \/\/ does not compile\r\n    std::vector&lt;int> vec1(10);    \r\n    \/\/ error: \u2018EnumType::operator int()\u2019 is private\r\n    \/\/ vec1[myEnumIdx] = 1; \r\n    \r\n    \/\/ does compile cause EnumArray is a friend of EnumType and can array private implicit conversion operator to int\r\n    EnumArray&lt;EnumType, int> arr;\r\n    arr[myEnumIdx] = 1;\r\n    \r\n    EnumType2 myEnumIdx2;\r\n    \/\/ does not compile\r\n    \/\/ error: no match for \u2018operator[]\u2019 (operand types are \u2018EnumArray<EnumType, int>\u2019 and \u2018EnumType2\u2019)\r\n    \/\/ note:   no known conversion for argument 1 from \u2018EnumType2\u2019 to \u2018const EnumType&\u2019\r\n    arr[myEnumIdx2] = 1;    \r\n}\r\n\r\n\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Type safe enum class replace with normal class. Used as an index (key) type for continuous containers like std::vector \/ std::array instead of std::map etc. Pro: Fun. Con: dynamic indice. myEnumIdx.somedata = 100000; can blow up the hole thing. For static enum array see http:\/\/fcppt.org\/da\/dcf\/classfcppt_1_1container_1_1enum__array.html#af01f0518d2f63f4fd47eb5c510855c63 http:\/\/fcppt.org\/d6\/ddd\/group__fcpptenum.html #include &lt;vector> template&lt;typename Key, typename Value> class EnumArray { [&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-2429","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\/2429","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=2429"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2429\/revisions"}],"predecessor-version":[{"id":2436,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2429\/revisions\/2436"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2429"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}