{"id":1176,"date":"2019-06-03T11:20:02","date_gmt":"2019-06-03T11:20:02","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=1176"},"modified":"2019-08-14T19:59:48","modified_gmt":"2019-08-14T19:59:48","slug":"haftalik-c-16-stdvariant","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/","title":{"rendered":"Haftal\u0131k C++ 16 \u2013 std::variant"},"content":{"rendered":"<p><\/p>\n<p id=\"CwKMvFK\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1185 aligncenter\" src=\"http:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a.png\" alt=\"\" width=\"483\" height=\"604\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a.png 701w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a-240x300.png 240w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a-500x625.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a-150x187.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a-400x500.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/06\/img_5cf502b5aec1a-200x250.png 200w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Merhaba arkada\u015flar, bu yaz\u0131mda daha \u00f6nce <em>std::optional<\/em> ile ba\u015flad\u0131\u011f\u0131m\u0131z ve birbirleri ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm ikinci kabiliyetten bahsedece\u011fim,\u00a0<em>std::variant<\/em>. <\/span><\/p>\n<p><span style=\"font-weight: 400;\"><em>std::optional <\/em>ve benzeri di\u011fer kabiliyet yaz\u0131lar\u0131ma a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz:<\/span><\/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>std::variant<\/strong><\/span><\/li>\n<li><a href=\"http:\/\/www.yazilimperver.com\/index.php\/2019\/08\/14\/haftalik-c-18-stdany\/\"><span style=\"color: #008000;\"><strong>std::any<\/strong><\/span><\/a><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Geriye sadece std::any kalm\u0131\u015f oluyor, o kabiliyete ayr\u0131 bir yaz\u0131da yer verece\u011fim. Peki <em>std::variant<\/em> nedir?<\/span><\/p>\n<p>Tek bir c\u00fcmle ile std::variant&#8217;\u0131 \u00f6zetleyecek olursak, &#8220;<strong>tip g\u00fcvenli union&#8217;lar<\/strong>&#8220;, ibaresi union yap\u0131lar\u0131n\u0131 bilenleriniz i\u00e7in yeterli olacakt\u0131r. <em>union\u00a0<\/em>yap\u0131lar\u0131n\u0131 bilmeyenleriniz i\u00e7in ise k\u0131saca, <em>union<\/em>&#8216;lara da bir g\u00f6z atal\u0131m. Bu sayede std::variant gibi yap\u0131n\u0131n nereden geldi\u011fini ve hangi s\u0131k\u0131nt\u0131lara derman oldu\u011funu anlamam\u0131z daha kolay olacakt\u0131r diye umuyorum.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Birlik (&#8220;union&#8221;):<\/span><\/strong><\/h2>\n<p>Asl\u0131nda <em>union\u00a0<\/em>(birlik) yap\u0131s\u0131 C programlama dili ile de sunulmaktayd\u0131. Temel olarak bu yap\u0131 ile birlikte <em>belirli ve sabit<\/em> bir bellek alan\u0131na, farkl\u0131 zamanlarda, <em>farkl\u0131 veri tiplerinde<\/em> verileri girebilmeyi sa\u011flayan yap\u0131d\u0131r. Bunun ile birlikte bellekten de tasarruf sa\u011flanabiliyordu. Bu yap\u0131lar\u0131n nesnelerini olu\u015fturabildi\u011fimiz gibi i\u015faret\u00e7ilerini de olu\u015fturabiliyoruz. Bu yap\u0131y\u0131 olu\u015fturan de\u011fi\u015fkenlere, isimleri ile eri\u015febilirsiniz. Bildi\u011fimiz <em>struct<\/em> yap\u0131lar\u0131ndan farkl\u0131 olarak, <em>union<\/em>&#8216;\u0131 olu\u015fturulan de\u011fi\u015fkenlerin her biri i\u00e7in yer ayr\u0131lmaz, ilgili de\u011fi\u015fkenlerin en b\u00fcy\u00fc\u011f\u00fc kadar yer ayr\u0131l\u0131r. Hemen bir \u00f6rnek \u00fczerinden bunu inceleyelim:<\/p>\n<pre class=\"lang:c++ decode:true \">union ExampleUnion\r\n{\r\n   char mCharValue;\r\n   int mIntValue;\r\n   float mFloatValue;\r\n};\r\n\r\nunion ExampleUnion instance;\r\nunion ExampleUnion* ptr;<\/pre>\n<p>Bu de\u011fi\u015fkenlerin herhangi birisi i\u00e7in veri girilebilir ama hepsi i\u00e7in girilemez. Bu sebeple e\u011fer <em>union\u00a0<\/em>kullanacaksan\u0131z bile, kullan\u0131lan tipi ayr\u0131ca bir de\u011fi\u015fken veya mekanizma ile takip etmelisiniz (\u00f6r. \u015fu an float tutuluyor ya da int). Yukar\u0131daki \u00f6rnek i\u00e7in a\u015fa\u011f\u0131daki kullan\u0131m bu anlamda daha g\u00fcvenli bir kullan\u0131m sa\u011flayacakt\u0131r (buna &#8220;<em>tagged unions&#8221;<\/em> da deniliyor).\u00a0Peki burada nas\u0131l bir problem olabilir. \u00d6r. <em>instance<\/em> nesnesi i\u00e7erisindeki <em>mCharValue<\/em> de\u011fi\u015fkenine bir de\u011fer atad\u0131\u011f\u0131n\u0131z zaman bu yap\u0131daki sadece bir byte kullan\u0131lm\u0131\u015f olacak ve di\u011fer \u00fc\u00e7 byte bo\u015f\/tan\u0131ms\u0131z kalacakt\u0131r. Bu da farkl\u0131 de\u011fi\u015fkenlere eri\u015fimlerde beklenmeyen problemlere yol a\u00e7abilir.<\/p>\n<pre class=\"lang:c++ decode:true\">struct ExampleUnion\r\n{\r\n  union\r\n  {\r\n    char mCharValue;\r\n    int mIntValue;\r\n    float mFloatValue;\r\n  };\r\n\r\n  \/\/ En son hangi tipi kullandigimiz\u0131 tutalim\r\n  enum { eCharType = 1, eIntType, eFloatType } mCurrentType;\r\n};\r\n\r\n\/\/ Yukaridaki degiskenlere asagidaki gibi erisebilirsiniz\r\ninstance.mCharValue = 'a';\r\ninstance.mIntValue = 1;\r\ninstance.mFloatValue = 3.14;<\/pre>\n<p><em>union<\/em> lar\u0131n yayg\u0131n olarak kullan\u0131ld\u0131\u011f\u0131 durumlardan birisini de a\u015fa\u011f\u0131da g\u00f6rebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">class Point3F\r\n{\r\npublic:\r\n \/\/ Point ile ilgili kabiliyetler, etc.\r\n union\r\n {\r\n   float mData[3];\r\n\r\n   struct\r\n   {\r\n\tfloat mX;\r\n\tfloat mY;\r\n\tfloat mZ;\r\n   };\r\n };\r\n};\r\n\r\nPoint3F position;\r\n\r\n\/\/ Ayni anda kullanilabilirler ve ayni anlama gelirler\r\nv.mData[0] = 1.0f;\r\nv., mX = 1.0f;<\/pre>\n<p>C&#8217;den farkl\u0131 olarak C++ <em>union<\/em> yap\u0131lar\u0131 i\u00e7erisinde private, pulic ve protected tan\u0131mlamalar\u0131 yap\u0131labilir. Ayr\u0131ca C++ 11 ile birlikte yap\u0131c\u0131\/y\u0131k\u0131c\u0131 ve kopya yap\u0131c\u0131 metotlar\u0131 veya atama operat\u00f6r\u00fc i\u00e7eren tipler de <em>union<\/em>&#8216;lar ile birlikte kullan\u0131labiliyorlar (\u00f6r. std::string).<\/p>\n<p>Sonu\u00e7 olarak <em>union<\/em>&#8216;lar ile ilgili ya\u015fad\u0131\u011f\u0131m\u0131z\/ya\u015fayabilece\u011fimiz problemleri a\u015fa\u011f\u0131daki gibi s\u0131ralayabiliriz:<\/p>\n<ul>\n<li>\u0130\u00e7erdi\u011fi veri tipinden farkl\u0131 bir veri tipindeki de\u011fi\u015fkene eri\u015fmeye kalkarsan\u0131z, kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z davran\u0131\u015f ho\u015funuza gitmeyebilir \ud83d\ude42 Buna ili\u015fkin durumlar\u0131 yukar\u0131da g\u00f6rd\u00fck.<\/li>\n<li>\u0130\u00e7erdi\u011fi veri tipini de\u011fi\u015ftirdi\u011finiz zaman ilgili nesneye ili\u015fkin yap\u0131c\u0131 veya y\u0131k\u0131c\u0131lar \u00e7a\u011fr\u0131lmaz. Hemen <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/union\">https:\/\/en.cppreference.com\/w\/cpp\/language\/union<\/a>&#8216;<\/span><\/strong>dan bir \u00f6rnek \u00fczerinden inceleyelim:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;vector&gt;\r\n\r\nunion CPlusPlusUnion\r\n{\r\n\tstd::string str;\r\n\tstd::vector&lt;int&gt; vec;\r\n\r\n\t\/\/ Burda hangi degiskenin yikicisi cagrilacak?\r\n\t~S() { }\r\n};\r\n\r\nint main()\r\n{\r\n\tS s = { \"Hello, world\" };\r\n\r\n\t\/\/ Bu noktada olak\u0131 s.vec i okumaya kalkarsaniz, ne ile karsilacaginiz tanimsizdir\r\n\tstd::cout &lt;&lt; \"s.str = \" &lt;&lt; s.str &lt;&lt; '\\n';\r\n\r\n\t\/\/ Diger degiskeni kullanmadan once, bir oncekinin yikicisini cagirmalisiniz!\r\n\ts.str.~basic_string&lt;char&gt;();\r\n\r\n\t\/\/ Sonra da yeni tipin yapicisini\r\n\tnew (&amp;s.vec) std::vector&lt;int&gt;;\r\n\r\n\t\/\/ Artik s.vec i kullanabilirsiniz. Pek kolay olmadi ne dersiniz :)\r\n\ts.vec.push_back(10);\r\n\tstd::cout &lt;&lt; s.vec.size() &lt;&lt; '\\n';\r\n\r\n\t\/\/ Simdi artik bunu da el ile cagirmamiz gerekiyor\r\n\ts.vec.~vector&lt;int&gt;();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p>Bu konu ile ilgili daha detayl\u0131 bilgi edinmek i\u00e7in kaynaklar k\u0131sm\u0131nda verdi\u011fim, referanslara bir g\u00f6z atabilirsiniz.<\/p>\n<p>Sonu\u00e7 olarak <em>std::variant<\/em>, bellek belir bir miktarda yer kaplayan (ki bu alan\u0131 <em>boost::variant<\/em>&#8216;\u0131n aksine dinamik olarak alm\u0131yor) ve tan\u0131mlanan tipler aras\u0131nda, bu alan\u0131n daha g\u00fcvenli kullan\u0131lmas\u0131na olanak sa\u011flayan mekanizma olarak \u00f6zetleyebiliriz. Ayr\u0131ca e\u011fer \u00e7ok alt seviye bir kabiliyet geli\u015ftirmiyorsan\u0131z, <em>union<\/em>&#8216;lar yerine std::<em>variant<\/em>&#8216;\u0131 tercih edebilirsiniz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>std::variant:<\/strong><\/span><\/h2>\n<p><em>std::variant<\/em>, programlama d\u00fcnyas\u0131nda, <em><strong>&#8220;sum type&#8221;<\/strong><\/em> denilen kavram\u0131n C++ d\u00fcnyas\u0131ndaki kar\u015f\u0131l\u0131\u011f\u0131. Ayr\u0131ca<em><strong> &#8220;tagged union&#8221;, &#8220;closed discriminated union&#8221;<\/strong><\/em> olarak da ifade edilebiliyor. Ne demek peki bu? Asl\u0131nda k\u0131saca (elbette arkas\u0131nda olduk\u00e7a derin bir teorik arka plan oldu\u011funa eminim), ayn\u0131 anda bir farkl\u0131 tiplerden sadece birisini tutan tiplere verilen isim (\u00f6r. e\u011fer bir tip ayn\u0131 anda sadece A ya da B olabiliyor ise). Bunun bir benzerine de &#8220;<em><strong>product types<\/strong><\/em>&#8221; deniliyor. Bu da, birden fazla tipi i\u00e7erisinde bar\u0131nd\u0131ran tiplere verilen isim (\u00f6r. s<em>truct, tuple,<\/em> vb).<\/p>\n<p><em>std::variant<\/em> ile C++, belirlenmi\u015f olan olas\u0131 tip alternatiflerini i\u00e7erebilen ve bunlar\u0131 daha g\u00fcvenli bir \u015fekilde kullan\u0131lmas\u0131n\u0131 olanak sa\u011flayan &#8220;<em><strong>sum type<\/strong><\/em>&#8221; mekanizmas\u0131n\u0131 bizlere sunuyor.<\/p>\n<p><em>std::variant<\/em>, C++ 17 ile birlikte sunulmaya ba\u015fland\u0131 ve kullanmak i\u00e7in &#8216;&lt;variant&gt;&#8217; ba\u015fl\u0131k dosyas\u0131n\u0131 eklemeniz gerekmekte. <em>std::variant<\/em> asl\u0131nda arka planda \u015fu anda aktif olarak kullan\u0131lan tipi tutar (bu anlamda ekstra bir bellek kullan\u0131m\u0131 vard\u0131r, ama tahmin edebilece\u011finiz \u00fczere minic\u00fck), ayr\u0131ca i\u00e7erisindeki de\u011fi\u015fkenlere ili\u015fkin de indeksleme\/numaraland\u0131rma yap\u0131larak, bu de\u011fi\u015fkenlere bu indeksler \u00fczerinde de eri\u015fim sa\u011flan\u0131yor (birazdan g\u00f6rece\u011fiz). Dinamik bellek kullan\u0131m\u0131 yap\u0131lmaz. Kullan\u0131lmas\u0131 olas\u0131 b\u00fct\u00fcn tipleri tan\u0131mlama s\u0131ras\u0131nda belirlemeniz ve sa\u011flaman\u0131z gerekiyor. Varsay\u0131lan olarak ilk tan\u0131mlanan tip aktif olarak atan\u0131r. Burada ayr\u0131ca ayn\u0131 tipten birden fazla tutabilirsiniz (semantik olarak farkl\u0131 anlamlar\u0131 ifade etmeleri i\u00e7in) ama bo\u015f std::variant tan\u0131mlamalar\u0131na ya da referans tipleri ya da dizi tiplerine izin verilmez (bo\u015f olarak tan\u0131mlamaya y\u00f6nelik <em>std::monostate<\/em>\u00a0yap\u0131s\u0131 tan\u0131mlanm\u0131\u015f, bunun kullan\u0131m\u0131na da ileride de\u011finece\u011fim).<\/p>\n<p>Peki hangi ama\u00e7lar i\u00e7in bu yap\u0131y\u0131 kullanabiliriz. Burada bunlar\u0131 listeleyip, \u00f6rnek kodlar\u0131 ise yaz\u0131m\u0131n sonunda sizler ile payla\u015faca\u011f\u0131m.<\/p>\n<ul>\n<li>Benim ilk akl\u0131ma gelen a\u00e7\u0131k\u00e7as\u0131, belirli bir alan i\u00e7in birden fazla tip kullanma ihtiyac\u0131 olan durumlarda: komut sat\u0131r\u0131 parametrelerinin i\u015flenmesi, konfig\u00fcrasyon dosyalar\u0131n\u0131n y\u00f6netilmesi, \u00f6zellik atamalar\u0131 vb.,<\/li>\n<li>Bir anlamda vtable kullanmadan, polimorfizmin sa\u011flanmas\u0131 amac\u0131 ile kullan\u0131m\u0131 olabilir,<\/li>\n<li>&#8220;State machine&#8221; ger\u00e7eklenmesi i\u00e7in de ilgin\u00e7 bir kullan\u0131m\u0131 var. Bu kullan\u0131ma ili\u015fkin detaylar i\u00e7in\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/khuttun.github.io\/2017\/02\/04\/implementing-state-machines-with-std-variant.html\">http:\/\/khuttun.github.io\/2017\/02\/04\/implementing-state-machines-with-std-variant.html<\/a> <\/strong><\/span>ve <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.youtube.com\/watch?v=ojZbFIQSdl8\">https:\/\/www.youtube.com\/watch?v=ojZbFIQSdl8<\/a><\/strong><\/span> videosuna bir g\u00f6z atabilirsiniz.<\/li>\n<li>Hatalar\u0131n d\u00f6nd\u00fcr\u00fclmesi,<\/li>\n<\/ul>\n<p>Kabiliyetlerin detaylar\u0131n\u0131 s\u0131ralamadan \u00f6nce hemen \u00f6rnek bir kullan\u0131ma bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;variant&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n\t\/\/ std::string aktif tip\r\n\tstd::variant&lt;int, std::string&gt; varInstance{ \"Selam\" };\r\n\r\n\t\/\/ Ciktisi 1\r\n\tstd::cout &lt;&lt; varInstance.index() &lt;&lt; '\\n';\r\n\r\n\t\/\/ Simdi art\u0131k aktif tip int\r\n\tvarInstance = 42;\r\n\r\n\t\/\/ Cikti 0\r\n\tstd::cout &lt;&lt; varInstance.index() &lt;&lt; '\\n';\r\n\r\n\t...\r\n\t\ttry\r\n\t{\r\n\t\t\/\/ \u0130lgili degere index ile erisim\r\n\t\tint i = std::get&lt;0&gt;(varInstance);\r\n\r\n\t\t\/\/ Su an aktif tip int oldugu i\u00e7in asagidaki kullan\u0131m exception atar\r\n\t\tauto s = std::get&lt;std::string&gt;(varInstance);\r\n\r\n\t\t\/\/ Yukaridaki satirin exception atmayan hali de mevcut elbette\r\n\t\t\/\/ Bu durumda std =&gt; nullptr\r\n\t\tauto str = std::get_if&lt;std::string&gt;(&amp;var);\r\n\r\n\t\t...\r\n\t}\r\n\tcatch (const std::bad_variant_access&amp; e)\r\n\t{\r\n\t\t\/\/ Hatali tipe erisim durumunda alacag\u0131m\u0131z hata\r\n\t\tstd::cerr &lt;&lt; \"Hata: \" &lt;&lt; e.what() &lt;&lt; '\\n';\r\n\t\t...\r\n\t}\r\n}<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">Kabiliyetler:<\/span><\/strong><\/h2>\n<p>\u015eimdi <em>std::optional<\/em>&#8216;da oldu\u011fu gibi, kalem kalem <em>std::variant<\/em> kullan\u0131m\u0131na ili\u015fkin hususlar\u0131n \u00fczerinden \u00f6rnek kodlar ile birlikte ge\u00e7elim:<\/p>\n<ul>\n<li><em>std::variant<\/em> nesnelerini nas\u0131l olu\u015fturabiliriz:\n<ul>\n<li>\u00d6ncelikli olarak <em>std::variant\u00a0<\/em>varsay\u0131lan olarak sa\u011flanan ilk eleman\u0131n, varsay\u0131lan yap\u0131c\u0131s\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r ve onun tipi aktif olarak atan\u0131r,<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ aktif tip\u00a0int yapilir ve degeri 0 olarak atanir. Index de 0 dir\r\nstd::variant&lt;int, float, std::string&gt; v1;<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Ya da ilgili de\u011feri ge\u00e7irerek de nesneyi olu\u015fturabilirsiniz. Bu durumda, de\u011fere en iyi kar\u015f\u0131l\u0131k gelen tip se\u00e7ilir:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Aktif tip float, degeri 4.14 ve index de 1 dir\r\nstd::variant&lt;int, float, std::string&gt; instance1 { 4.14F};\r\n\r\n\/\/ Hata: hangisi belli degil? 4.5 int'e de float'a da donusebilir\r\nstd::variant&lt;int, float, std::string&gt; instance2{4.5};\r\n\r\n\/\/ Hata: hangisi belli degil?\r\nstd::variant&lt;int, float&gt; instance3{42.3}; \r\n\r\n\/\/ Bu tanimlamada cikarim yapilabilir ve aktif tip double olur\r\nstd::variant&lt;int, double&gt; instance4{42.3};<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\u00a0E\u011fer hangisinin se\u00e7ilece\u011fi belli de\u011fil ise <em>std::in_place_index<\/em> ile a\u00e7\u0131k bir \u015fekilde hangi tipin se\u00e7ilmesi gerekti\u011fi dikte edilebilir:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Aktif tipin float olarak atanmas\u0131 dikte edilir ve yukar\u0131daki kar\u0131\u015f\u0131kl\u0131k giderilir\r\nstd::variant&lt;int, float, std::string&gt; instance5 { std::in_place_index&lt;1&gt;, 4.5 }; \r\n<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><em>std::in_place_index\u00a0<\/em>ile &#8220;initialize list&#8221;\u00a0nesnelerini de kullanabilirsiniz:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">std::variant&lt;std::vector&lt;int&gt;, int, std::string&gt; instance6{std::in_place_index&lt;0&gt;,{4, 8, -7, -2, 0, 5}};<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>E\u011fer daha karma\u015f\u0131k veri tipleri kullan\u0131yorsan\u0131z, bu durumda da <em>std::in_place<\/em> yap\u0131s\u0131 da kullan\u0131labilir:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Hatal\u0131 kullan\u0131m. Birden fazlda ilklendirme degeri direk ge\u00e7irilemez\r\nstd::variant&lt;std::complex&lt;double&gt;&gt; instance5{3.0, 4.0};\r\n\/\/ Hatal\u0131 kullan\u0131m. \r\nstd::variant&lt;std::complex&lt;double&gt;&gt; instance6{{3.0, 4.0}};\r\n\r\n\/\/ in_place_type\/in_place_index ile birden fazla deger gecirilebilir\r\nstd::variant&lt;std::complex&lt;double&gt;&gt; v11{std::in_place_type&lt;std::complex&lt;double&gt;&gt;, 3.0, 4.0};\r\nstd::variant&lt;std::complex&lt;double&gt;&gt; v12{std::in_place_index&lt;0&gt;, 3.0, 4.0};<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Varsay\u0131lan yap\u0131c\u0131s\u0131 olmayan tipleri de desteklemek ad\u0131na, <em>std::monostate\u00a0<\/em>yap\u0131s\u0131 da bu k\u00fct\u00fcphane taraf\u0131ndan sunulmaktad\u0131r. Bu yap\u0131n\u0131n temek amac\u0131, <em>std::variant<\/em> nesnesinin, herhangi bir tipe ait bir de\u011fer i\u00e7ermedi\u011fi durumlar\u0131 ifade etmektir. Nas\u0131l yani? Mesela, varsay\u0131lan yap\u0131c\u0131s\u0131 olmayan bir tipi de <em>std::variant<\/em> ile kullanmak istedi\u011fimizi d\u00fc\u015f\u00fcnelim ve bu nesneyi de herhangi bir de\u011fer atamadan olu\u015fturmam\u0131z gerekiyor ne yapaca\u011f\u0131z? Hemen bakal\u0131m:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">struct NoDefConstr \r\n{\r\n      NoDefConstr(int i) {\r\n        std::cout &lt;&lt; \"NoDefConstr::NoDefConstr(int) called\\n\";\r\n      }\r\n};\r\n\r\n\/\/ Hatal\u0131 kullan\u0131m. NoDefConstr varsay\u0131lan yap\u0131c\u0131s\u0131 yok.\r\nstd::variant&lt;NoDefConstr, int&gt; instanceError;\r\n\r\n\/\/ Burada NoDefConstr tipini de i\u00e7erebilecek nesne olusturulur ve index de 0 olur\r\nstd::variant&lt;std::monostate, NoDefConstr, int&gt; instanceOk;<\/pre>\n<ul>\n<li><em>std::variant<\/em> taraf\u0131ndan tutulan de\u011ferlere nas\u0131l eri\u015febiliriz?\n<ul>\n<li>Tutulan de\u011ferin tipini \u00f6\u011frenmek i\u00e7in <em>std::holds_alternative&lt;&gt;()<\/em> API&#8217;sini kullanabilirsiniz:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">#include &lt;variant&gt;\r\n#include &lt;string&gt;\r\n#include &lt;iostream&gt;\r\nint main()\r\n{\r\n    std::variant&lt;int, std::string&gt; v = \"abc\";\r\n    std::cout &lt;&lt; std::boolalpha\r\n              &lt;&lt; \"variant holds int? \"\r\n              &lt;&lt; std::holds_alternative&lt;int&gt;(v) &lt;&lt; '\\n'\r\n              &lt;&lt; \"variant holds string? \"\r\n              &lt;&lt; std::holds_alternative&lt;std::string&gt;(v) &lt;&lt; '\\n';\r\n}<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\u00a0\u0130lgili de\u011fere ula\u015fmak i\u00e7in, alternatifin tipini girerek <em>get&lt;TYPE&gt;()<\/em> API&#8217;sini kullanabilirsiniz. Ayn\u0131 zamanda tip yerine indexi de girebilirsiniz <em>get&lt;INDEX&gt;()<\/em>. Burada e\u011fer ilgili tip tan\u0131ml\u0131 de\u011fil ise derleme zaman\u0131nda hata, e\u011fer mevcut atanm\u0131\u015f tipten farkl\u0131 bir tipte veri sorgulamaya kalkarsan\u0131z da \u00e7al\u0131\u015fma zaman\u0131nda hata (&#8220;exception&#8221;) f\u0131rlat\u0131l\u0131r.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">#include &lt;variant&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n\t\/\/ Ornek variant nesnemiz.\r\n\tstd::variant&lt;int, float, std::string&gt; var;\r\n\r\n\t\/\/ Duzgun kullanim mevcut int degeri (0) donulur. Iki kullanim da ayni\r\n\tauto intVal1 = std::get&lt;int&gt;(var);\r\n\tauto intVal2 = std::get&lt;0&gt;(var);\r\n\r\n\t\/\/ Hata: double tanimli degil\r\n\tauto dblValue = std::get&lt;double&gt;(var);          \/\/ compile-time ERROR: no double\r\n\r\n\t\/\/ Hata: 5. alternatif tip tanimli degil\r\n\tauto nonValue= std::get&lt;4&gt;(var);              \r\n\r\n\ttry \r\n\t{\r\n\t\t\/\/ Su an aktif tip int oldugu icin hata firlatilir\r\n\t\tauto s = std::get&lt;std::string&gt;(var);   \r\n\r\n\t\t\/\/ Problem yok. Gecerli kullanim\r\n\t\tauto i = std::get&lt;0&gt;(var);             \r\n\r\n\t\t\/\/ Su an aktif tip indeksi 0 oldugu icin yine hata firlatilir\r\n\t\tauto j = std::get&lt;1&gt;(var);             \r\n\t}\r\n\tcatch (const std::bad_variant_access&amp; e) \r\n\t{      \r\n\t\tstd::cout &lt;&lt; \"Exception: \" &lt;&lt; e.what() &lt;&lt; '\\n';\r\n\t}\r\n\r\n\treturn 0;\r\n}<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\u00a0<em>get&lt;&gt;()<\/em> API&#8217;si yan\u0131nda hata f\u0131rlatmayan ve ilgili de\u011fere eri\u015fmeden kontrol yapman\u0131za olanak sa\u011flayan <em>get_if&lt;&gt;()<\/em> API&#8217;sini de kullanabilirsiniz. Di\u011fer API&#8217;den fark\u0131 ise bunun ilgili nesnenin i\u015faret\u00e7isini parametre olarak almas\u0131:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ ip burada ilgili tipe i\u015faret\u00e7iyi tutuyor ve hatal\u0131 durumlarda nullptr olarak atan\u0131yor\r\nif (auto ip = std::get_if&lt;1&gt;(&amp;var); ip) \r\n{\r\n  std::cout &lt;&lt; *ip &lt;&lt; '\\n';\r\n}\r\nelse \r\n{\r\n  std::cout &lt;&lt; \"alternative with index 1 not set\\n\";\r\n}<\/pre>\n<ul>\n<li>Evet de\u011ferlere nas\u0131l eri\u015fti\u011fimize bakt\u0131ktan sonra \u015fimdi de nas\u0131l de\u011fi\u015ftirebilece\u011fimize bakal\u0131m:\n<ul>\n<li>\u0130lgili nesneye de\u011feri atamak i\u00e7in <em>atama operat\u00f6r\u00fcn\u00fc<\/em> ya da <em>emplace()<\/em> API&#8217;sini kullanabilirsiniz. Ayr\u0131ca <em>get<\/em> ve <em>get_if<\/em> API&#8217;leri de referans ve i\u015faret\u00e7i d\u00f6nd\u00fc\u011f\u00fc i\u00e7in onlar da kullan\u0131labilir:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Su an int aktif tip\r\nstd::variant&lt;int, float, std::string&gt; instance; \r\n\r\n\/\/ Artik aktif tip std::string ve indeks 2\r\ninstance = \"Merhaba\";\r\n\r\n\/\/ Artik aktif tip float ve indeks 1\r\ninstance.emplace&lt;2&gt;(3.5f);\r\n\r\n\/\/ Aktif tip float oldugu icin hata aliriz\r\nstd::get&lt;0&gt;(var) = 77;                   \r\n\r\n\/\/ Herhangi bir sikinti yok\r\nstd::get&lt;1&gt;(var) = 55.6f;\r\n\r\n\/\/ Ayn\u0131 sekilde isaretciler \u00fczerinde degisiklikte bir s\u0131k\u0131nt\u0131 yok\r\nif (auto p = std::get_if&lt;1&gt;(&amp;var); p)\r\n\t*p = 8.5f;<\/pre>\n<ul>\n<li>Ayr\u0131ca \u00e7ok kritik olmasa da, ayn\u0131 tip iki <em>std::variant<\/em> nesnesini kar\u015f\u0131la\u015ft\u0131rabilirsiniz. Aktif tiplerin farkl\u0131 olmas\u0131 durumunda hangisinin aktif oldu\u011funa g\u00f6re kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri d\u00f6n\u00fc\u015f sa\u011flar:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true \">std::variant&lt;std::monostate, int, std::string&gt; v1;\r\nstd::variant&lt;std::monostate, int, std::string&gt; v2{ \"hello\" };\r\nstd::variant&lt;std::monostate, int, std::string&gt; v3{ 42 };\r\nstd::variant&lt;std::monostate, std::string, int&gt; v4;\r\n\r\n\/\/ Derleme zamani hatasi (farkli tipler)\r\nv1 == v4   \/\/ COMPILE-TIME ERROR\r\n\r\n\/\/ false\r\nv1 == v2\r\n\r\n\/\/ true\r\nv1 &lt; v2    \/\/ yields true\r\n\r\n\/\/ true\r\nv1 &lt; v3    \/\/ yields true\r\n\r\n\/\/ false\r\nv2 &lt; v3\r\n\r\nv1 = \"hello\";\r\n\r\n\/\/ true\r\nv1 == v2\r\n\r\nv2 = 41;\r\n\r\n\/\/ true\r\nv2 &lt; v3<\/pre>\n<ul>\n<li><em>std::variant<\/em>&#8216;lar\u0131 kulland\u0131\u011f\u0131n\u0131z durumlarda, ilgili nesnelerin bar\u0131nd\u0131rd\u0131klar\u0131 tiplere g\u00f6re baz\u0131 i\u015fleri yapmak istersiniz. Bu i\u015flevi de kolayla\u015ft\u0131rmak ad\u0131na STL&#8217;de bizlere <em>std::visit<\/em> API sini sunmakta. Bu API&#8217;nin temel amac\u0131, kendisine ge\u00e7irilen std::<em>variant<\/em> nesne\/nesnelerini ilgili aktif tiplerine g\u00f6re ge\u00e7irilen fonksiyon taraf\u0131ndan \u00e7a\u011fr\u0131lmas\u0131. Burada tabi ilgili fonksiyonun her bir tip i\u00e7in tan\u0131mlanm\u0131\u015f olmas\u0131 \u00f6nemli. Aksi halde derleme hatas\u0131 al\u0131rs\u0131n\u0131z. San\u0131r\u0131m buna bir \u00f6rnek \u00fczerinden baksak daha iyi olacak \ud83d\ude42<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true \">#include &lt;variant&gt;\r\n#include &lt;string&gt;\r\n#include &lt;iostream&gt;\r\n\r\nstruct ExampleVisitor\r\n{\r\n\tvoid operator() (int i) const \r\n\t{\r\n\t\tstd::cout &lt;&lt; \"int:    \" &lt;&lt; i &lt;&lt; '\\n';\r\n\t}\r\n\t\r\n\tvoid operator() (std::string s) const \r\n\t{\r\n\t\tstd::cout &lt;&lt; \"string: \" &lt;&lt; s &lt;&lt; '\\n';\r\n\t}\r\n\t\r\n\tvoid operator() (double d) const \r\n\t{\r\n\t\tstd::cout &lt;&lt; \"double: \" &lt;&lt; d &lt;&lt; '\\n';\r\n\t}\r\n};\r\n\r\nint main()\r\n{\r\n\tstd::variant&lt;int, std::string, double&gt; var(42);\r\n\r\n\t\/\/ MyVisitor'\u0131n int i\u00e7in olan\u0131 \u00e7a\u011fr\u0131l\u0131r\r\n\tstd::visit(ExampleVisitor(), var);  \r\n\tvar = \"hello\";\r\n\t\/\/ MyVisitor'\u0131n std::string i\u00e7in olan\u0131 ca\u011fr\u0131l\u0131r\r\n\tstd::visit(ExampleVisitor(), var);  \r\n\tvar = 42.7;\r\n\r\n\t\/\/ MyVisitor'\u0131n double i\u00e7in olan\u0131 \u00e7a\u011fr\u0131l\u0131r\r\n\tstd::visit(ExampleVisitor(), var);\r\n}<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>\u00a0visitor ile ayr\u0131ca ilgili nesnedeki aktif tipin de\u011ferini de de\u011fi\u015ftirebilirsiniz ama aktif tipi de\u011fi\u015ftiremezsiniz:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true \">struct Twice\r\n{\r\n\tvoid operator()(double&amp; d) const \r\n\t{\r\n\t\td *= 2;\r\n\t}\r\n\tvoid operator()(int&amp; i) const\r\n\t{\r\n\t\ti *= 2;\r\n\t}\r\n\tvoid operator()(std::string&amp; s) const\r\n\t{\r\n\t\ts = s + s;\r\n\t}\r\n};\r\n\r\nstd::visit(Twice(), var);<\/pre>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>std::visit&#8217;in lambdalar ile de kullan\u0131mlar\u0131 mevcut. Burada sadece basit bir \u00f6rnek verip, sizleri ilgili kaynaklara bakmaya davet ediyorum. A\u015fa\u011f\u0131da basit\u00e7e ilgili nesnenin aktif tipine g\u00f6re de\u011feri standard \u00e7\u0131kt\u0131ya basan bir lambda \u00f6rne\u011fini g\u00f6rebilirsiniz. Benzer \u015fekilde i\u00e7eri\u011fi de de\u011fi\u015ftirebilirsiniz.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">auto printvariant = [](const auto&amp; val) {\r\n                        std::cout &lt;&lt; val &lt;&lt; '\\n';\r\n                    };\r\n...\r\nstd::visit(printvariant, var);<\/pre>\n<ul>\n<li><em>std::variant<\/em> ayr\u0131ca ta\u015f\u0131ma operat\u00f6rleri (<em>std::move<\/em>) ile de kullanabilirsiniz,<\/li>\n<li><em>std::variant&#8217;<\/em>lar her ne kadar bellekten ufak bir \u00f6d\u00fcn versek de, \u00e7al\u0131\u015fma zaman\u0131 performans\u0131nda herhangi bir kayba yol a\u00e7m\u0131yor. A\u015fa\u011f\u0131da ayr\u0131ca Ms Visual Studio 2017 i\u00e7in denedi\u011fim kod i\u00e7in ald\u0131\u011f\u0131m boyut de\u011ferlerini g\u00f6rebilirsiniz:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">#include &lt;variant&gt;\r\n#include &lt;string&gt;\r\n#include &lt;iostream&gt;\r\n\r\nint main()\r\n{\r\n\tstd::cout &lt;&lt; \"sizeof string: \"\r\n\t\t&lt;&lt; sizeof(std::string) &lt;&lt; \"\\n\";\r\n\r\n\tstd::cout &lt;&lt; \"sizeof variant&lt;int, string&gt;: \"\r\n\t\t&lt;&lt; sizeof(std::variant&lt;int, std::string&gt;) &lt;&lt; \"\\n\";\r\n\r\n\tstd::cout &lt;&lt; \"sizeof variant&lt;int, float&gt;: \"\r\n\t\t&lt;&lt; sizeof(std::variant&lt;int, float&gt;) &lt;&lt; \"\\n\";\r\n\r\n\tstd::cout &lt;&lt; \"sizeof variant&lt;int, double&gt;: \"\r\n\t\t&lt;&lt; sizeof(std::variant&lt;int, double&gt;) &lt;&lt; \"\\n\";\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p>sizeof string: <strong>40<\/strong><br \/>\nsizeof variant&lt;int, string&gt;: <strong>48<\/strong><br \/>\nsizeof variant&lt;int, float&gt;: <strong>8<\/strong><br \/>\nsizeof variant&lt;int, double&gt;: <strong>16<\/strong><\/p>\n<ul>\n<li>\u00a0Akl\u0131n\u0131z\u0131n bir k\u00f6\u015fesinde durmas\u0131 gereken son konu ise, alternatif tiplerin olu\u015fturulmas\u0131 ya da g\u00fcncellenmesi s\u0131ras\u0131nda hata f\u0131rlat\u0131lmas\u0131 durumu. Bunu da yine g\u00fczel bir \u015fekilde g\u00f6steren a\u015fa\u011f\u0131daki \u00f6rnek kod \u00fczerinden inceleyelim.<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ Hata f\u0131rtlatmas\u0131 i\u00e7in \u00f6rnek bir durum olusturalim\r\nclass ThrowingClass\r\n{\r\npublic:\r\n    explicit ThrowingClass(int i) { if (i == 0) throw int (10); }\r\n    operator int () { throw int(10); }\r\n};\r\n\r\nint main(int argc, char** argv) \r\n{\r\n    std::variant&lt;int, ThrowingClass&gt; v;\r\n\r\n    \/\/ Hatay\u0131 tetikleyelim:\r\n    try\r\n    {\r\n        v = ThrowingClass(0);\r\n    }\r\n    catch (...)\r\n    {\r\n        std::cout &lt;&lt; \"catch(...)\\n\";\r\n\r\n        \/\/ Burada hata eski deger degisitirilmeden olustugu icin eski degere ulasip nesneyi kullanmaya devam edebiliriz.\r\n        std::cout &lt;&lt; v.valueless_by_exception() &lt;&lt; \"\\n\";   \r\n        std::cout &lt;&lt; std::get&lt;int&gt;(v) &lt;&lt; \"\\n\"; \r\n    }\r\n\r\n    \/\/ emplace() durumuna da bir goz atal\u0131m\r\n    \/\/ Burada geri donus biraz zor\r\n    try\r\n    {\r\n        \/\/ Yukaridaki durumdan farkl\u0131 olarak emplace in dogasindan \u00f6t\u00fcr\u00fc bir \u00f6nceki aktif tip yok edildikten sonra hata f\u0131rlat\u0131ld\u0131g\u0131 icin\r\n        \/\/ eski degere ne yaz\u0131kki ulasam\u0131yoruz.\r\n        \/\/ Ayrica bu nesne de artik kullanilamaz\r\n        v.emplace&lt;0&gt;(ThrowingClass(10)); \/\/ calls the operator int\r\n    }\r\n    catch (...)\r\n    {\r\n        std::cout &lt;&lt; \"catch(...)\\n\";\r\n        \/\/ Su an da tan\u0131ml\u0131 olmayan gecersiz bir durum bas\u0131l\u0131r\r\n        std::cout &lt;&lt; v.valueless_by_exception() &lt;&lt; \"\\n\";   \r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Yaz\u0131m\u0131 tamamlamadan \u00f6nce,\u00a0<span style=\"font-weight: 400;\">\u00e7ok temel baz\u0131 kullan\u0131mlar\u0131 i\u00e7eren \u00f6rnek kodlar\u0131 sizler ile payla\u015faca\u011f\u0131m. Bunlar\u0131 <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.bfilipek.com\/2018\/06\/variant.html\">Bartlomiej Filipek<\/a>&#8216;<\/span><\/strong>in sayfas\u0131ndan ald\u0131m, \u00f6rnek kullan\u0131mlar\u0131 g\u00f6stermesi a\u00e7\u0131s\u0131ndan olduk\u00e7a\u00a0g\u00fczel. Bunlardan ilki poliformizme benzer bir mekanizmay\u0131, miras mekanizmas\u0131n\u0131 kullanmadan nas\u0131l ba\u015farabilece\u011fimiz g\u00f6steriyor:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;variant&gt;\r\n\r\nclass Triangle\r\n{\r\npublic:\r\n\tvoid Render() { std::cout &lt;&lt; \"Drawing a triangle!\\n\"; }\r\n};\r\n\r\nclass Polygon\r\n{\r\npublic:\r\n\tvoid Render() { std::cout &lt;&lt; \"Drawing a polygon!\\n\"; }\r\n};\r\n\r\nclass Sphere\r\n{\r\npublic:\r\n\tvoid Render() { std::cout &lt;&lt; \"Drawing a sphere!\\n\"; }\r\n};\r\n\r\nint main()\r\n{\r\n\tstd::vector&lt;std::variant&lt;Triangle, Polygon, Sphere&gt;&gt; objects{\r\n\t\tPolygon(),\r\n\t\tTriangle(),\r\n\t\tSphere(),\r\n\t\tTriangle()\r\n\t};\r\n\r\n\tauto CallRender = [](auto&amp; obj) { obj.Render(); };\r\n\r\n\tfor (auto&amp; obj : objects)\r\n\t\tstd::visit(CallRender, obj);\r\n\r\n}<\/pre>\n<p>Bir di\u011feri ise hata durumlar\u0131n\u0131n kotar\u0131lmas\u0131na ili\u015fkin:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;variant&gt;\r\n\r\nenum class ErrorCode\r\n{\r\n\tOk,\r\n\tSystemError,\r\n\tIoError,\r\n\tNetworkError\r\n};\r\n\r\n\/\/ Hata mi aldik yoksa ilgili string dogru bir sekilde geldi mi?\r\nstd::variant&lt;std::string, ErrorCode&gt; FetchNameFromNetwork(int i)\r\n{\r\n\tif (i == 0)\r\n\t\treturn ErrorCode::SystemError;\r\n\r\n\tif (i == 1)\r\n\t\treturn ErrorCode::NetworkError;\r\n\r\n\treturn std::string(\"Hello World!\");\r\n}\r\n\r\nint main()\r\n{\r\n\t\/\/ Sistem hatasi durumu\r\n\tauto response = FetchNameFromNetwork(0);\r\n\r\n\tif (std::holds_alternative&lt;std::string&gt;(response))\r\n\t\tstd::cout &lt;&lt; std::get&lt;std::string&gt;(response) &lt;&lt; \"n\";\r\n\telse\r\n\t\tstd::cout &lt;&lt; \"Error!\\n\";\r\n\r\n\t\/\/ Duzgun bir sekilde stringin alinmasi durumu\r\n\tresponse = FetchNameFromNetwork(10);\r\n\r\n\tif (std::holds_alternative&lt;std::string&gt;(response))\r\n\t\tstd::cout &lt;&lt; std::get&lt;std::string&gt;(response) &lt;&lt; \"n\";\r\n\telse\r\n\t\tstd::cout &lt;&lt; \"Error!\\n\";\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p>Evet arkada\u015flar, bu yaz\u0131 ile birlikte <em>std::variant<\/em>\u00a0maceram\u0131z\u0131n da sonuna geldik. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Referanslar:<\/span><\/strong><\/h2>\n<ul>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/union\"><strong><span style=\"color: #008000;\">https:\/\/en.cppreference.com\/w\/cpp\/language\/union<\/span><\/strong><\/a><\/li>\n<li><a href=\"http:\/\/www.informit.com\/articles\/article.aspx?p=31783&amp;seqNum=2\"><strong><span style=\"color: #008000;\">http:\/\/www.informit.com\/articles\/article.aspx?p=31783&amp;seqNum=2<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=k3O4EKX4z1c\"><strong><span style=\"color: #008000;\">https:\/\/www.youtube.com\/watch?v=k3O4EKX4z1c<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/variant\"><strong><span style=\"color: #008000;\">https:\/\/en.cppreference.com\/w\/cpp\/utility\/variant<\/span><\/strong><\/a><\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.cppstd17.com\/\">C++ 17 The Complete Guide, Nicolai M. Josuttis<\/a><\/span><\/strong><\/li>\n<li><a href=\"https:\/\/www.bfilipek.com\/2018\/06\/variant.html\"><strong><span style=\"color: #008000;\">https:\/\/www.bfilipek.com\/2018\/06\/variant.html<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/pabloariasal.github.io\/2018\/06\/26\/std-variant\/\"><strong><span style=\"color: #008000;\">https:\/\/pabloariasal.github.io\/2018\/06\/26\/std-variant\/<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/arne-mertz.de\/2018\/05\/modern-c-features-stdvariant-and-stdvisit\/\"><strong><span style=\"color: #008000;\">https:\/\/arne-mertz.de\/2018\/05\/modern-c-features-stdvariant-and-stdvisit\/<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/dzone.com\/articles\/how-to-use-stdvisit-with-multiple-variants\"><strong><span style=\"color: #008000;\">https:\/\/dzone.com\/articles\/how-to-use-stdvisit-with-multiple-variants<\/span><\/strong><\/a><\/li>\n<li><a href=\"https:\/\/manishearth.github.io\/blog\/2017\/03\/04\/what-are-sum-product-and-pi-types\/\"><strong><span style=\"color: #008000;\">https:\/\/manishearth.github.io\/blog\/2017\/03\/04\/what-are-sum-product-and-pi-types\/<\/span><\/strong><\/a><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, bu yaz\u0131mda daha \u00f6nce std::optional ile ba\u015flad\u0131\u011f\u0131m\u0131z ve birbirleri ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm ikinci kabiliyetten bahsedece\u011fim,\u00a0std::variant. std::optional ve benzeri di\u011fer kabiliyet yaz\u0131lar\u0131ma a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz: std::optional std::variant std::any Geriye sadece std::any kalm\u0131\u015f oluyor, o kabiliyete ayr\u0131 bir yaz\u0131da yer verece\u011fim. Peki std::variant nedir? Tek bir c\u00fcmle ile std::variant&#8217;\u0131 \u00f6zetleyecek olursak, &#8220;tip g\u00fcvenli union&#8217;lar&#8220;,&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\">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":[234,468,466,467,42,458,462,461,465,464,463,405,460,459],"class_list":["post-1176","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c-17","tag-emplace","tag-get","tag-get_if","tag-modern-c","tag-optional","tag-product-types","tag-stdholds_alternative","tag-stdin_place","tag-stdin_place_index","tag-stdmonostate","tag-stdvariant","tag-tagged-unions","tag-union"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 16 \u2013 std::variant - 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\/06\/03\/haftalik-c-16-stdvariant\/\" \/>\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++ 16 \u2013 std::variant[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba arkada\u015flar, bu yaz\u0131mda daha \u00f6nce std::optional ile ba\u015flad\u0131\u011f\u0131m\u0131z ve birbirleri ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm ikinci kabiliyetten bahsedece\u011fim,\u00a0std::variant. std::optional ve benzeri di\u011fer kabiliyet yaz\u0131lar\u0131ma a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz: std::optional std::variant std::any Geriye sadece std::any kalm\u0131\u015f oluyor, o kabiliyete ayr\u0131 bir yaz\u0131da yer verece\u011fim. Peki std::variant nedir? Tek bir c\u00fcmle ile std::variant&#8217;\u0131 \u00f6zetleyecek olursak, &#8220;tip g\u00fcvenli union&#8217;lar&#8220;,... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-03T11:20:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-14T19:59:48+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=\"18 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\/06\/03\/haftalik-c-16-stdvariant\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 16 \u2013 std::variant\",\"datePublished\":\"2019-06-03T11:20:02+00:00\",\"dateModified\":\"2019-08-14T19:59:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\"},\"wordCount\":1962,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++ 17\",\"emplace\",\"get\",\"get_if\",\"Modern C++\",\"optional\",\"product types\",\"std::holds_alternative\",\"std::in_place\",\"std::in_place_index\",\"std::monostate\",\"std::variant\",\"tagged unions\",\"union\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\",\"name\":\"[:tr]Haftal\u0131k C++ 16 \u2013 std::variant[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-06-03T11:20:02+00:00\",\"dateModified\":\"2019-08-14T19:59:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 16 \u2013 std::variant\"}]},{\"@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++ 16 \u2013 std::variant[:] - 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\/06\/03\/haftalik-c-16-stdvariant\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 16 \u2013 std::variant[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba arkada\u015flar, bu yaz\u0131mda daha \u00f6nce std::optional ile ba\u015flad\u0131\u011f\u0131m\u0131z ve birbirleri ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm ikinci kabiliyetten bahsedece\u011fim,\u00a0std::variant. std::optional ve benzeri di\u011fer kabiliyet yaz\u0131lar\u0131ma a\u015fa\u011f\u0131daki ba\u011flant\u0131lardan ula\u015fabilirsiniz: std::optional std::variant std::any Geriye sadece std::any kalm\u0131\u015f oluyor, o kabiliyete ayr\u0131 bir yaz\u0131da yer verece\u011fim. Peki std::variant nedir? Tek bir c\u00fcmle ile std::variant&#8217;\u0131 \u00f6zetleyecek olursak, &#8220;tip g\u00fcvenli union&#8217;lar&#8220;,... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-06-03T11:20:02+00:00","article_modified_time":"2019-08-14T19:59:48+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":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 16 \u2013 std::variant","datePublished":"2019-06-03T11:20:02+00:00","dateModified":"2019-08-14T19:59:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/"},"wordCount":1962,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++ 17","emplace","get","get_if","Modern C++","optional","product types","std::holds_alternative","std::in_place","std::in_place_index","std::monostate","std::variant","tagged unions","union"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/","name":"[:tr]Haftal\u0131k C++ 16 \u2013 std::variant[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-06-03T11:20:02+00:00","dateModified":"2019-08-14T19:59:48+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/06\/03\/haftalik-c-16-stdvariant\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 16 \u2013 std::variant"}]},{"@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\/1176","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=1176"}],"version-history":[{"count":10,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1176\/revisions"}],"predecessor-version":[{"id":1344,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1176\/revisions\/1344"}],"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=1176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}