{"id":1334,"date":"2019-08-14T19:58:57","date_gmt":"2019-08-14T19:58:57","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=1334"},"modified":"2019-08-14T19:58:57","modified_gmt":"2019-08-14T19:58:57","slug":"haftalik-c-18-stdany","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/","title":{"rendered":"Haftal\u0131k C++ 18 \u2013 std::any"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/images.unsplash.com\/photo-1530488228536-37ae1dbb20a4?ixlib=rb-1.2.1&amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;auto=format&amp;fit=crop&amp;w=1000&amp;q=80\" alt=\"close-up photography of white, pink, and red petaled flower centerpiece\" width=\"439\" height=\"658\" \/><\/p>\n<p>Evet arkada\u015flar, kurban bayram\u0131n\u0131 f\u0131rsat bilerek araya bir yaz\u0131 daha s\u0131k\u0131\u015ft\u0131rabildim \ud83d\ude42 Uzun s\u00fcredir yazmak istedi\u011fim ve <em>std::optional<\/em>, <em>std::variant<\/em> ve <em>std::any<\/em> kabiliyetlerinden sonuncusu olan <em>std::any<\/em> yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131 ile birlikte birbirine benzeyen bu \u00fc\u00e7 kabiliyete de de\u011finmi\u015f olaca\u011f\u0131n\u0131z. Kod payla\u015f\u0131mlar\u0131m\u0131 takip edenleriniz, asl\u0131nda baz\u0131 kodlar\u0131mda <em>std::any<\/em> kullan\u0131mlar\u0131n\u0131 g\u00f6rm\u00fc\u015f olduklar\u0131n\u0131 umuyorum. Serinin di\u011fer yaz\u0131lar\u0131na a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz.<\/p>\n<ol>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/04\/15\/haftalik-c-14-stdoptional\/\">std::optional<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\">std::variant<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong>std::any<\/strong><\/span><\/li>\n<\/ol>\n<p>Di\u011fer yaz\u0131larda oldu\u011fu gibi, \u00f6ncelikle b\u00f6yle bir kabiliyete ihtiya\u00e7 nereden has\u0131l oldu? Bunu daha \u00f6nce nas\u0131l \u00e7\u00f6z\u00fcyorduk veya \u00e7\u00f6zebiliyor muyduk? Sonras\u0131nda ise madde madde \u00f6rnekleri ile ilgili kabiliyete ili\u015fkin kullan\u0131mlar\u0131 sizlere aktar\u0131yor olaca\u011f\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>std::any:<\/strong><\/span><\/h2>\n<p>Evet gelelim bu kabiliyetin \u00f6z\u00fcne. Asl\u0131nda ilgili anahtar kelimenin size bir fikir verdi\u011fini d\u00fc\u015f\u00fcn\u00fcyorum. Daha \u00f6nce <em>std::variant<\/em> (ve dahi union&#8217;lar) ile birlikte \u00f6n tan\u0131ml\u0131 tipler i\u00e7in, belirli ve sabit bir bellek alan\u0131na, farkl\u0131 zamanlarda, farkl\u0131 veri tiplerinde verileri girebilmeyi sa\u011flayan yap\u0131 mevcut idi. Bu kullan\u0131mda, olas\u0131 tiplerin biliniyor olmas\u0131 en \u00f6nemli husus. E\u011fer bunlar biliniyor ve sabit ise <em>std::variant<\/em> ile birlikte <em>std::visitor<\/em> do\u011fru bir tercih olacakt\u0131r. E\u011fer, olas\u0131 tipler belli de\u011fil veya daha sonradan farkl\u0131 tiplerin de kullan\u0131lmas\u0131 durumu var ise o zaman <em>std::any<\/em> sizin i\u00e7in daha uygun bir tercih olacakt\u0131r. Peki tek fark bu mu? Hay\u0131r, bunun ile birlikte <em>std::variant<\/em>&#8216;ta herhangi bir dinamik bellek kullan\u0131m\u0131 yoktur ve bellek alan\u0131 sabittir, fakat <em>std::any<\/em> i\u00e7in dinamik bellek kullan\u0131labilir ve sonu\u00e7 olarak ilkine g\u00f6re biraz daha maliyetli olacakt\u0131r. Sizlere h\u0131zl\u0131 bir giri\u015f yapt\u0131ktan sonra \u015fimdi kabiliyete biraz daha yak\u0131ndan bakal\u0131m.<\/p>\n<p>Yukar\u0131da yazd\u0131klar\u0131mdan sonra, ee ben bunu &#8220;void*&#8221; ile de yapar\u0131m. Evet asl\u0131nda hakl\u0131s\u0131n\u0131z, C++ 17&#8217;e kadar a\u015fa\u011f\u0131daki gibi bir kullan\u0131m ile <em>std::any<\/em>&#8216;e benzer, tip g\u00fcvenli\u011fine nispeten sahip bir kullan\u0131m elde edebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">class OurAnyClass\r\n{\r\n    void* mValue;\r\n    std::type_info mTypeInfo;\r\n};<\/pre>\n<p>fakat bu pek de g\u00fczel ve standart bir kullan\u0131m de\u011fil. Bunun yerine STL&#8217;in sundu\u011fu kabiliyeti kullanmak daha iyi olacakt\u0131r. <em>std::any<\/em> nesneleri herhangi bir tipe ait de\u011feri tutabilirken, ayn\u0131 zamanda, tuttu\u011fu bu de\u011fere ili\u015fkin tip bilgisine de sahip ve olas\u0131 tipleri deklarasyon a\u015famas\u0131nda belirtmeye de gerek yok. Yukar\u0131da \u00f6rnek olarak verdi\u011fimiz kod gibi, ilgili nesne hem atanan de\u011feri hem de ilgili de\u011fere ili\u015fkin tip bilgisini tutmakta. Burada ilgili k\u00fct\u00fcphane, basit tipler i\u00e7in dinamik bellek kullanmadan bir \u00e7\u00f6z\u00fcm sunabilir ama di\u011fer tipler i\u00e7in dinamik bellek al\u0131m\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r.<\/p>\n<p>Burada, \u015funu da unutmamak laz\u0131m. Her \u015fey i\u00e7in de tutup <em>std::any<\/em> kullanmak tahmin edebilece\u011finiz \u00fczere bir \u00e7ok a\u00e7\u0131dan pek do\u011fru olmayacakt\u0131r. Hatta m\u00fcmk\u00fcn oldu\u011funca bundan ka\u00e7\u0131nmak daha do\u011fru bir davran\u0131\u015f olacakt\u0131r. Bu konuda daha fazla bilgi edinmek isteyenler a\u015fa\u011f\u0131daki tart\u0131\u015fmalara g\u00f6z atabilirler:<\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.reddit.com\/r\/cpp\/comments\/7l3i19\/why_was_stdany_added_to_c17\/\"> https:\/\/www.reddit.com\/r\/cpp\/comments\/7l3i19\/why_was_stdany_added_to_c17\/<\/a><\/strong><\/span><\/p>\n<p>Peki hangi durumlar i\u00e7in <em>std::any<\/em> kullanabiliriz. A\u015fa\u011f\u0131daki durumlarda kullan\u0131labilece\u011fi de\u011ferlendirilmektedir:<\/p>\n<ul>\n<li>\u00d6znitelikler. \u00d6zellikle grafiksel kullan\u0131c\u0131 aray\u00fcz ya da benzeri kontroller i\u00e7in \u00f6znitelik verilerinin tutulmas\u0131 amac\u0131 ile. Ya da jenerik (isim-de\u011fer) \u00f6zellik tablolar\u0131 i\u00e7in de kullan\u0131labilir. Buna benzer bir kullan\u0131ma, <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/06\/11\/basit-coklu-oyuncu-motoru-snake-v2-0-giris\/\">B\u00c7OM&#8217;da<\/a> <\/span><\/strong>g\u00f6rebilirsiniz,<\/li>\n<li>E\u011fer farkl\u0131 tiplerin olmas\u0131 beklenen konfig\u00fcrasyon veya benzeri dosyalar\u0131n ay\u0131klanmas\u0131 amac\u0131 ile. Bu ama\u00e7la std::variant da kullan\u0131labilir ama std::any ile daha jenerik bir \u00e7\u00f6z\u00fcm elde edilebilir,<\/li>\n<li>Farkl\u0131 parametrelerin ge\u00e7irilmesi amac\u0131 ile,<\/li>\n<li>Betik dilleri ile entegrasyon ya da yorumlay\u0131c\u0131lar\u0131 ile,<\/li>\n<\/ul>\n<p>kullan\u0131labilir. Evet art\u0131k <em>std::any<\/em> yeteneklerine daha yak\u0131ndan bakabiliriz.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Kabiliyetler:<\/span><\/strong><\/h2>\n<p><em>std::any<\/em> kabiliyeti ilk olarak C++ 17 ile sunulmaya ba\u015fland\u0131 (tabi daha \u00f6ncesinde boost k\u00fct\u00fcphanelerinde benzer bir kabiliyet sunulmaktayd\u0131) ve bu kabiliyeti kullanmak i\u00e7in <strong>&lt;any&gt;<\/strong> ba\u015fl\u0131k dosyas\u0131n\u0131 eklemeniz ve std alan uzay\u0131na eri\u015fmeniz gerekmektedir. <em>std::any, variant<\/em> ya da <em>optional<\/em> gibi template bir s\u0131n\u0131f de\u011fil, fakat <em>std::optional<\/em> gibi varsay\u0131lan olarak herhangi bir de\u011fer i\u00e7ermez (bunu <em>has_value()<\/em> API&#8217;si ile kontrol edebiliriz). E\u011fer bir de\u011fer ile ilklendirirseniz, ilgili nesneye o tip atan\u0131r. \u015eimdi di\u011fer yeteneklere madde madde bakal\u0131m:<\/p>\n<ul>\n<li><strong><em>std::any<\/em> nesnelerini nas\u0131l olu\u015fturabiliriz?<\/strong>\n<ul>\n<li>Ba\u015fta da bahsetti\u011fim gibi, farkl\u0131 \u015fekillerde bu tipin nesnelerini olu\u015fturabilir, olu\u015fturdu\u011funuz nesneler zaman i\u00e7erisinde farkl\u0131 tipler tutabilir:<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">std::any emptyAny; \/\/ bo\u015f bir nesne\r\nstd::any dblAny = 4.3; \/\/ b 4.3 de\u011ferine sahip ve tipi double\r\nemptyAny = 42; \/\/ art\u0131k int tipinde ve 42 de\u011ferine sahip\r\ndblAny = std::string{\"merhaba\"}; \/\/ dblAny std::string tipinde ve \"merhaba\" i\u00e7eriyor<\/pre>\n<\/li>\n<li>Peki <em>std::any<\/em> nesnesinin verdi\u011finiz de\u011ferden farkl\u0131 bir tip bilgisini tutmas\u0131n\u0131 istedi\u011finizde ne yapabilirsiniz. O noktada da <em>std::in_place_type<\/em> tipini a\u015fa\u011f\u0131daki gibi kullanabilirsiniz:<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">std::any a4{std::in_place_type&lt;long&gt;, 42};\r\nstd::any a5{std::in_place_type&lt;std::string&gt;, \"hello\"};<\/pre>\n<\/li>\n<li>Nesnelerin kendilerini olu\u015fturmadan (yani nesnenin kendisi olu\u015fturmadan) birden fazla parametre alan nesneler ile std::any olu\u015fturmak i\u00e7in de <em>std::in_place_type <\/em>kullan\u0131labilir:<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">\/\/ Burada ilgili nesne olu\u015fturuldu\u011fu i\u00e7in std::in_place_type e gerek yok\r\nstd::any complex1{std::complex{3.0, 4.0}};\r\n\r\n\/\/ Burada hangi nesne oldugunu anlamas\u0131 i\u00e7in std::in_place_type gecirmemiz lazim\r\nstd::any complex2{std::in_place_type&lt;std::complex&lt;double&gt;&gt;, 3.0, 4.0};<\/pre>\n<\/li>\n<li>\u00a0Yukar\u0131da verilen olu\u015fturma y\u00f6ntemleri yan\u0131nda ak\u0131ll\u0131 i\u015faret\u00e7ilerdeki gibi <em>std::make_any&lt;&gt;()<\/em> fonksiyonu da kullan\u0131labilir.<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">auto floatInst = std::make_any&lt;float&gt;(3.1);\r\nauto strInst = std::make_any&lt;std::string&gt;(\"merhaba\");\r\nauto objectInst = std::make_any&lt;std::complex&lt;double&gt;&gt;(3.0, 4.0);\r\n<\/pre>\n<\/li>\n<li>Yukar\u0131daki olu\u015fturma y\u00f6ntemlerinden sonra <em>std::any<\/em>&#8216;nin nesnelerin ya\u015fam s\u00fcrelerini nas\u0131l y\u00f6netti\u011fini merak etmi\u015f olmal\u0131s\u0131n\u0131z. Herhangi bir bellek s\u0131z\u0131nt\u0131s\u0131na mahal vermemek i\u00e7in, yeni bir nesne atamas\u0131 yap\u0131ld\u0131\u011f\u0131 anda <em>std::any<\/em> nesnesi taraf\u0131ndan tutulan \u00f6nceki nesne yok edilir,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">struct ExampleType\r\n{\r\n   ExampleType(){ std::cout &lt;&lt; \"ExampleType yapicisi cagrildi!\\n\"}\r\n   ~ExampleType(){ std::cout &lt;&lt; \"ExampleType yikicisi cagrildi!\\n\"}   \r\n\r\n   int mData;\r\n};\r\n\r\nstd::any anyInstance = std::make_any&lt;ExampleType&gt;();\r\nvar = 100.0F;\r\n\r\n\/\/ Asagidaki satir calistirilmasi ile su ciktilari goruruz\r\n\/\/ ExampleType yapicisi cagrildi!\r\n\/\/ ExampleType yikicisi cagrildi!\r\n\/\/ 100\r\nstd::cout &lt;&lt; std::any_cast&lt;float&gt;(var) &lt;&lt; \"\\n\";\r\n<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Mevcut <em>std::any<\/em> nesnelerinin hangi tipte veri tuttu\u011funu g\u00f6rmek i\u00e7in\u00a0<em>type<\/em>() API&#8217;sini kullanabiliriz,\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">std::vector&lt;std::any&gt; listOfElements;\r\nv.push_back(42);\r\nstd::string s = \"merhaba\";\r\nv.push_back(s);\r\n\r\nfor (const auto&amp; a : v) \r\n{\r\n   if (a.type() == typeid(std::string)) \r\n   {\r\n      std::cout &lt;&lt; \"string value: \" &lt;&lt; std::any_cast&lt;const std::string&amp;&gt;(a) &lt;&lt; '\\n';\r\n   }\r\n   else if (a.type() == typeid(int)) \r\n   {\r\n      std::cout &lt;&lt; \"int value: \" &lt;&lt; std::any_cast&lt;int&gt;(a) &lt;&lt; '\\n';\r\n   }\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Mevcut <em>std::any<\/em> nesnelerinin de\u011ferlerini nas\u0131l de\u011fi\u015ftirebiliriz?\n<ul>\n<li>\u00d6ncelikli olarak atama operat\u00f6r\u00fcn\u00fc (=) kullanabilirsiniz, bunun ile birlikte\u00a0<em>emplace<\/em>() API&#8217;si de bu ama\u00e7la kullan\u0131labilir.<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">std::any anyInst;\r\nanyInst = 42; \/\/ anyInst nesnesi int degerini icerir\r\nanyInst = \"hello\"; \/\/ anyInst nesnesi art\u0131k char* degerini icerir\r\nanyInst.emplace {std::in_place_type&lt;std::string&gt;, \"hello\"}; \/\/ anyInst nesnesi art\u0131k std::string degerini icerir<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><em>std:.any<\/em> nesneleri taraf\u0131ndan tutulan de\u011ferlere nas\u0131l eri\u015febiliriz?\n<ul>\n<li>\u0130lgili de\u011ferlere eri\u015fmek i\u00e7in <em>std::any_cast<\/em> ba\u011f\u0131ms\u0131z fonksiyonlar\u0131 kullan\u0131labilir<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">std::string anyValue(\"merhaba dunya\");\r\nstd::any_cast&lt;std::string&gt;(anyValue); \/\/ Tutulan degere iliskin bir kopya donulur\r\nstd::any_cast&lt;std::string&amp;&gt;(anyValue); \/\/ Tutulan degere referans donulur\r\nstd::any_cast&lt;const std::string&amp;&gt;(anyValue); \/\/ Tutulan degere sadece sabit referans araciligi ile erisim saglanir<\/pre>\n<\/li>\n<li>Yukar\u0131daki kullan\u0131mlarda e\u011fer tip farkl\u0131l\u0131\u011f\u0131 olu\u015fur ise <em>std::bad_any_cast<\/em> hatas\u0131\/istisnas\u0131 f\u0131rlat\u0131l\u0131r.<br \/>\nE\u011fer hatal\u0131 bir durumda hata f\u0131rlat\u0131lmas\u0131 yerine <em>nullptr<\/em> d\u00f6n\u00fclmesini istiyor iseniz ilgili nesnenin referans\u0131 ge\u00e7irilir. Yaln\u0131z i\u015faret\u00e7isi ge\u00e7irilen\u00a0<em>std::any\u00a0<\/em>nesnelerinin referanslar\u0131na eri\u015fim ise hataya sebep olur.<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">std::any_cast&lt;std::string&gt;(&amp;a) \/\/ Tutulan degere isaretci araciligi ile yaz\u0131labilir erisim\r\nstd::any_cast&lt;const std::string&gt;(&amp;a); \/\/ Tutulan degere isaretci araciligi ile sadece okunabilir erisim\r\nstd::any_cast&lt;std::string&amp;&gt;(&amp;a); \/\/ \u00c7al\u0131\u015fma zaman\u0131 hatas\u0131<\/pre>\n<\/li>\n<li>Bu arada ba\u015fta da de\u011finmi\u015ftim ama b\u00fct\u00fcnl\u00fck a\u00e7\u0131s\u0131nda burada da de\u011fineyim. \u0130lgili <em>std::any<\/em> nesnesinin herhangi bir de\u011fer i\u00e7erip i\u00e7ermedi\u011fini ise <em>has_value()<\/em> API&#8217;si ile kontrol edebilirsiniz\n<pre class=\"lang:c++ decode:true\">if (anyInstance.has_value()) \r\n{\r\n    ...\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u00a0<em>std::any<\/em>\u00a0ta\u015f\u0131ma operat\u00f6rleri ile de kullan\u0131labilmektedir. Fakat bu kabiliyeti kullanabilmek i\u00e7in ilgili tipin kopyalanabilir bir tip olmas\u0131 gerekmektedir. Yaln\u0131z ta\u015f\u0131nabilir tipler <em>std::any<\/em> ile kullan\u0131lamazlar.<\/li>\n<li><em>std::any<\/em> di\u011fer benzeri yap\u0131lardan farkl\u0131 olarak bellekten dinamik olarak yer al\u0131rlar. Bu konuda standart, k\u00fct\u00fcphane geli\u015ftiricileri &#8220;SBO-Small Buffer Optimization&#8221;&#8216;\u0131 kullanmalar\u0131n\u0131, yani int ve benzeri basit tipler i\u00e7in dinamik bellek kullan\u0131m\u0131ndan ka\u00e7\u0131nmalar\u0131n\u0131 te\u015fvik eder. Internette g\u00f6rd\u00fc\u011f\u00fcm kadar\u0131yla farkl\u0131 derleyiciler kullan\u0131larak yap\u0131lan boyut \u00f6l\u00e7\u00fcmleri a\u015fa\u011f\u0131daki gibi sonu\u00e7 vermi\u015f. Bu da g\u00f6steriyor ki, ciddi manada bir bellek kullan\u0131m\u0131 getiriyor.\n<ul>\n<li>\n<table>\n<thead>\n<tr>\n<th>Derleyici<\/th>\n<th><code>sizeof(any) sonucu<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>GCC 8.1 (Coliru \u00c7.\u0130.D.)<\/td>\n<td>16<\/td>\n<\/tr>\n<tr>\n<td>Clang 7.0.0 (Wandbox \u00c7.\u0130.D.)<\/td>\n<td>32<\/td>\n<\/tr>\n<tr>\n<td>MSVC 2017 15.7.0 32-bit<\/td>\n<td>40<\/td>\n<\/tr>\n<tr>\n<td>MSVC 2017 15.7.0 64-bit<\/td>\n<td>64<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ul>\n<\/li>\n<li><em>std::any&#8217;<\/em>i STL konteynerleri ile de rahatl\u0131kla kullanabilirsiniz.\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true prettyprint prettyprinted\">\/\/ std::map ile ornek kullanim\r\nstd::map&lt;std::string, std::any&gt; anyDictionary;\r\nanyDictionary[\"integer\"] = 10;\r\nanyDictionary[\"string\"] = std::string(\"Merhaba yazilimperver\");\r\nanyDictionary\"float\"] = 1.0f;\r\n\r\nfor (auto &amp;[key, val] : anyDictionary)\r\n{\r\n    if (val.type() == typeid(int))\r\n        std::cout &lt;&lt; \"int: \" &lt;&lt; std::any_cast&lt;int&gt;(val) &lt;&lt; \"\\n\";\r\n    else if (val.type() == typeid(std::string))\r\n        std::cout &lt;&lt; \"string: \" &lt;&lt; std::any_cast&lt;std::string&gt;(val) &lt;&lt; \"\\n\";\r\n    else if (val.type() == typeid(float))\r\n        std::cout &lt;&lt; \"float: \" &lt;&lt; std::any_cast&lt;float&gt;(val) &lt;&lt; \"\\n\";\r\n}\r\n\r\n\/\/ std::vector ile ozellikleri tutmak icin ornek kullanim\r\nstruct Property\r\n{\r\n    Property();\r\n    Property(const std::string &amp;, const std::any &amp;);\r\n\r\n    std::string mName;\r\n    std::any mValue;\r\n};\r\n\r\ntypedef std::vector&lt;Property&gt; PropertList;<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, bu yaz\u0131 ile tamamlad\u0131\u011f\u0131m\u0131z, \u00fc\u00e7 kabiliyeti, \u00fc\u00e7 c\u00fcmle ile \u00f6zetleyecek olursak:<\/p>\n<ul>\n<li><strong>std::optional:<\/strong> var olan bir nesneyi tutabilen veya hi\u00e7 bir \u015fey tutmayan\/tutmad\u0131\u011f\u0131n\u0131 ifade eden yap\u0131d\u0131r,<\/li>\n<li><strong>std::variant:<\/strong> tip g\u00fcvenli birlik (union) kabiliyetidir,<\/li>\n<li><strong>std::any:<\/strong> herhangi bir nesneyi tip g\u00fcvenli bir \u015fekilde tutabilmek i\u00e7in sunulan mekanizma.<\/li>\n<\/ul>\n<p>Evet bir haftal\u0131k C++ yaz\u0131m\u0131z\u0131n daha sonuna geldik dostlar, bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Kaynaklar<\/span><\/strong><\/h2>\n<ul>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/any\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/utility\/any<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.cppstd17.com\/\">C++ 17 The Complete Guide, Nicolai M. Josuttis<\/a><\/strong><\/span><\/li>\n<li><a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2006\/n1939.html\"><span style=\"color: #008000;\"><strong>http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2006\/n1939.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.geeksforgeeks.org\/stdany-class-in-c\/\"><span style=\"color: #008000;\"><strong>https:\/\/www.geeksforgeeks.org\/stdany-class-in-c\/<\/strong><\/span><\/a><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.reddit.com\/r\/cpp\/comments\/7l3i19\/why_was_stdany_added_to_c17\/\">https:\/\/www.reddit.com\/r\/cpp\/comments\/7l3i19\/why_was_stdany_added_to_c17\/<\/a><\/span><\/strong><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar, kurban bayram\u0131n\u0131 f\u0131rsat bilerek araya bir yaz\u0131 daha s\u0131k\u0131\u015ft\u0131rabildim \ud83d\ude42 Uzun s\u00fcredir yazmak istedi\u011fim ve std::optional, std::variant ve std::any kabiliyetlerinden sonuncusu olan std::any yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131 ile birlikte birbirine benzeyen bu \u00fc\u00e7 kabiliyete de de\u011finmi\u015f olaca\u011f\u0131n\u0131z. Kod payla\u015f\u0131mlar\u0131m\u0131 takip edenleriniz, asl\u0131nda baz\u0131 kodlar\u0131mda std::any kullan\u0131mlar\u0131n\u0131 g\u00f6rm\u00fc\u015f olduklar\u0131n\u0131 umuyorum. Serinin di\u011fer&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[536,540,13,234,468,407,542,541,42,458,539,537,538],"class_list":["post-1334","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-any","tag-any_cast","tag-c","tag-c-17","tag-emplace","tag-has_value","tag-in_place_type","tag-make_any","tag-modern-c","tag-optional","tag-small-buffer-optimization","tag-variant","tag-void"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 18 \u2013 std::any - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/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.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 18 \u2013 std::any[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar, kurban bayram\u0131n\u0131 f\u0131rsat bilerek araya bir yaz\u0131 daha s\u0131k\u0131\u015ft\u0131rabildim \ud83d\ude42 Uzun s\u00fcredir yazmak istedi\u011fim ve std::optional, std::variant ve std::any kabiliyetlerinden sonuncusu olan std::any yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131 ile birlikte birbirine benzeyen bu \u00fc\u00e7 kabiliyete de de\u011finmi\u015f olaca\u011f\u0131n\u0131z. Kod payla\u015f\u0131mlar\u0131m\u0131 takip edenleriniz, asl\u0131nda baz\u0131 kodlar\u0131mda std::any kullan\u0131mlar\u0131n\u0131 g\u00f6rm\u00fc\u015f olduklar\u0131n\u0131 umuyorum. Serinin di\u011fer... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-14T19:58:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 18 \u2013 std::any\",\"datePublished\":\"2019-08-14T19:58:57+00:00\",\"dateModified\":\"2019-08-14T19:58:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\"},\"wordCount\":1373,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"any\",\"any_cast\",\"c++\",\"c++ 17\",\"emplace\",\"has_value\",\"in_place_type\",\"make_any\",\"Modern C++\",\"optional\",\"Small Buffer Optimization\",\"variant\",\"void*\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\",\"name\":\"[:tr]Haftal\u0131k C++ 18 \u2013 std::any[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-08-14T19:58:57+00:00\",\"dateModified\":\"2019-08-14T19:58:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 18 \u2013 std::any\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 18 \u2013 std::any[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","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.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 18 \u2013 std::any[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar, kurban bayram\u0131n\u0131 f\u0131rsat bilerek araya bir yaz\u0131 daha s\u0131k\u0131\u015ft\u0131rabildim \ud83d\ude42 Uzun s\u00fcredir yazmak istedi\u011fim ve std::optional, std::variant ve std::any kabiliyetlerinden sonuncusu olan std::any yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131 ile birlikte birbirine benzeyen bu \u00fc\u00e7 kabiliyete de de\u011finmi\u015f olaca\u011f\u0131n\u0131z. Kod payla\u015f\u0131mlar\u0131m\u0131 takip edenleriniz, asl\u0131nda baz\u0131 kodlar\u0131mda std::any kullan\u0131mlar\u0131n\u0131 g\u00f6rm\u00fc\u015f olduklar\u0131n\u0131 umuyorum. Serinin di\u011fer... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-08-14T19:58:57+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"10 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 18 \u2013 std::any","datePublished":"2019-08-14T19:58:57+00:00","dateModified":"2019-08-14T19:58:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/"},"wordCount":1373,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["any","any_cast","c++","c++ 17","emplace","has_value","in_place_type","make_any","Modern C++","optional","Small Buffer Optimization","variant","void*"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/","name":"[:tr]Haftal\u0131k C++ 18 \u2013 std::any[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-08-14T19:58:57+00:00","dateModified":"2019-08-14T19:58:57+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 18 \u2013 std::any"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1334"}],"version-history":[{"count":7,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1334\/revisions"}],"predecessor-version":[{"id":1343,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1334\/revisions\/1343"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}