{"id":610,"date":"2018-11-09T06:42:43","date_gmt":"2018-11-09T06:42:43","guid":{"rendered":"https:\/\/yazilimperver.com\/?p=610"},"modified":"2022-08-13T19:29:19","modified_gmt":"2022-08-13T19:29:19","slug":"haftalik-c-4-yapisal-baglama-structured-binding","status":"publish","type":"post","link":"https:\/\/yazilimperver.com\/index.php\/2018\/11\/09\/haftalik-c-4-yapisal-baglama-structured-binding\/","title":{"rendered":"[:tr]Haftal\u0131k C++ &#8211; 4 Yap\u0131sal Ba\u011flama (&#8220;Structured Binding&#8221;)[:en]Weekly C++ &#8211; 4 Structured Binding[:]"},"content":{"rendered":"<p>[:tr]Merhabalar arkada\u015flar, yeni bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131m\u0131zda da modern C++ 17 ile birlikte gelen bir di\u011fer kabiliyet olan <em>&#8220;Structured Binding&#8221;<\/em>&#8216;e bakaca\u011f\u0131z. Ben yaz\u0131mda buna k\u0131saca &#8220;yap\u0131sal ba\u011flama&#8221; diyece\u011fim.<br \/>\nBu kabiliyet bize ne kazand\u0131r\u0131yor? K\u0131saca bu kabiliyet ile birlikte birden fazla de\u011fi\u015fkenin tek bir ifade ile<em> &#8220;tuple&#8221;\/&#8221;pair&#8221;<\/em> ya da benzeri yap\u0131lar\u0131 kullanarak ilklendirebilece\u011fiz, daha \u00f6nce <em>std::tuple<\/em> ve benzeri yap\u0131larla dolayl\u0131 yoldan sa\u011flanan \u00e7oklu de\u011fer d\u00f6nme kabiliyetini de art\u0131k kullanabilece\u011fiz. Bu kabiliyetin arkas\u0131nda yatan motivasyonun detaylar\u0131 i\u00e7in kaynaklar k\u0131sm\u0131nda verdi\u011fim standart dok\u00fcman\u0131na bir g\u00f6z atman\u0131zda fayda var.<br \/>\nBuna benzer kabiliyetleri ba\u015fka diller a\u00e7\u0131p atama (&#8220;<em>unpacking<\/em>&#8220;), \u00e7oklu atama (&#8220;<em>multiple assignment<\/em>&#8220;) isimleri ile sunuyorlar. \u00d6r. Pyhton da `(x, y) = 10, 20` diyerekten tek bir sat\u0131rda ilgili de\u011fi\u015fkenleri atayabiliyorsunuz.<br \/>\n\u0130\u015fte bu kabiliyet art\u0131k C++ ile de sunuluyor.<br \/>\nYaz\u0131mda detayl\u0131 olarak bu kabiliyeti tek tek anlatmaktansa genel yap\u0131s\u0131ndan bahsedip daha \u00f6nceki yaz\u0131lar\u0131mda oldu\u011fu gibi \u00e7e\u015fitli \u00f6rnekler \u00fczerinden giderek sizlere aktarmay\u0131 planl\u0131yorum.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Genel yap\u0131<\/strong><\/span><\/h2>\n<p>Yap\u0131sal ba\u011flama genel olarak a\u015fa\u011f\u0131daki format ile \u00f6zetlenebilir:<br \/>\n<span style=\"color: #ff0000;\">auto [element1, element2, &#8230;.] = { pair, tuple, struct ya da dizi tan\u0131mlamalar\u0131 }<\/span><\/p>\n<p>Dikkat edilecek hususlar:<\/p>\n<ul>\n<li>&#8220;element1, &#8230;, &#8221; &#8216;de virg\u00fcl ile ayr\u0131lan elemanlar\u0131n adeti ile atama operat\u00f6r\u00fc sa\u011f\u0131ndaki elemanlar\u0131n say\u0131s\u0131 ayn\u0131 olmal\u0131d\u0131r,<\/li>\n<li>Atama operat\u00f6r\u00fcn\u00fcn sa\u011f\u0131nda ise a\u015fa\u011f\u0131dakilerden birisi olabilir:\n<ul>\n<li>std:: pair ya da std::tuple<\/li>\n<li>bir struct nesnesi. Struct nesnesi i\u00e7erisindeki \u00fcyelerin hi\u00e7birisi statik olmamal\u0131. Bunlar\u0131n tan\u0131mlanma s\u0131ras\u0131na g\u00f6re atama operat\u00f6r\u00fcn\u00fcn solundaki elemanlar doldurulacak<\/li>\n<\/ul>\n<\/li>\n<li>Sabit boyutlu dizi<\/li>\n<li>Yukar\u0131daki durumlardan birisi sa\u011flanmad\u0131\u011f\u0131 durumda derleme hatas\u0131 ile kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z<\/li>\n<li>Bu arada atamalar s\u0131ras\u0131nda gereksiz kopyalamalar\u0131 \u00f6nlemek ad\u0131na olabildi\u011fince atama operat\u00f6r\u00fcn\u00fcn solunda referans tiplerini kullanmaya \u00f6zen g\u00f6stermekte fayda var<\/li>\n<li>Operat\u00f6r\u00fcn solunda <em><strong>auto, auto&amp;, const auto, const auto&amp;<\/strong><\/em> ve <em><strong>auto&amp;&amp;<\/strong><\/em> kullan\u0131mlar\u0131 m\u00fcmk\u00fcn.<\/li>\n<\/ul>\n<h2><span style=\"color: #0000ff;\"><strong>std::tuple ile kullan\u0131m\u0131<\/strong><\/span><\/h2>\n<p>Yap\u0131sal ba\u011flama&#8217;n\u0131n ilk kullan\u0131m \u00f6rne\u011fi <em>tuple<\/em>&#8216;lar ile alakl\u0131 olacak. \u00d6zellikle &#8220;<em>pair<\/em>&#8221; (bayad\u0131r mevcut) ya da &#8220;<em>tuple<\/em>&#8221; (C++ 11 ile birlikte geldi) benzeri yap\u0131lar ile u\u011fra\u015f\u0131yor iseniz bunlar\u0131n bar\u0131nd\u0131rd\u0131\u011f\u0131 de\u011ferlere eri\u015fme ihtiyac\u0131 duymu\u015fsunuzdur. <em>std::pair<\/em> asl\u0131nda <em>map<\/em> konteynerinin temel ta\u015f\u0131 diyebiliriz.<em> Std::tuple<\/em> da <em>std::pair<\/em>&#8216;in asl\u0131nda bir anlamda genelle\u015ftirilmi\u015f hali. Normal \u015fartlarda <em>tuple<\/em> ile ifade edilen bir de\u011fi\u015fkene ili\u015fkin elemanlar\u0131 farkl\u0131 de\u011fi\u015fkenlere atamak (ya da a\u00e7\u0131p kullanmak) i\u00e7in \u00f6nceden takip edilen y\u00f6ntem <em>std::tie()<\/em> metoduydu. Yeni gelen bu kabiliyet ile birlikte <strong><span style=\"color: #ff0000;\">&#8220;auto [var1, var2, &#8230;] = tuple;&#8221;<\/span><\/strong> kullan\u0131m\u0131 ile bu de\u011fi\u015fkenlere eri\u015fim sa\u011flan\u0131yor. Hemen buna ili\u015fkin bir kullan\u0131ma bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;tuple&gt;\r\n\r\nint main()\r\n{\r\n    auto employee = std::make_tuple(\"Ahmet\", \"Can\", 35, 174.3);\r\n\r\n    \/\/ C++ 17 Oncesi\r\n    \/\/ tuple icerisindeki degisklenlere erismek icin\r\n    {\r\n        \/\/ Oncelikle calisan verileri tutmak icin degiskenleri tanimlayalim\r\n        std::string name;\r\n        std::string surname;\r\n        int age;\r\n        double height;\r\n        \r\n        std::tie(name, surname, age, height) = employee;\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ C++ 17 Sonrasi kullanim\r\n    {\r\n        auto [ name, surname, age, height ] = employee;\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<p><em>tuple<\/em> kullan\u0131m\u0131ndaki bir di\u011fer s\u0131k\u0131nt\u0131 ise <em>std::tie()<\/em> ile <em>tuple<\/em>&#8216;daki elemanlar\u0131n referans\u0131n\u0131 almak m\u00fcmk\u00fcn de\u011fil idi. Bunun i\u00e7in tek yol &#8220;<em>std::get&lt;2&gt;(employee)<\/em>&#8221; metodu. Yeni mekanizma ile art\u0131k bu da m\u00fcmk\u00fcn:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;tuple&gt;\r\n\r\nint main()\r\n{\r\n    auto employee = std::make_tuple(\"Ahmet\", \"Can\", 35, 174.3);\r\n\r\n    \/\/ C++ 17 Oncesi\r\n    \/\/ tuple icerisindeki degiskenlerin referanslarini almak icin\r\n    {\r\n        \/\/ Oncelikle calisan verileri tutmak icin degiskenleri tanimlayalim\r\n        auto&amp; name = std::get&lt;0&gt;(employee);\r\n        auto&amp; surname = std::get&lt;1&gt;(employee);\r\n        auto&amp; age = std::get&lt;2&gt;(employee);\r\n        auto&amp; height = std::get&lt;2&gt;(employee);\r\n        \r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n        \/\/ Yasi artt\u0131ralim\r\n        age++;\r\n\r\n        std::cout &lt;&lt; \"yeni yas = \" &lt;&lt; std::get&lt;2&gt;(employee) &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ C++ 17 Sonrasi kullanim\r\n    {\r\n        auto&amp; [ name, surname, age, height ] = tuple;\r\n\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n        \/\/ Yasi artt\u0131ralim\r\n        age++;\r\n\r\n        std::cout &lt;&lt; \"yeni yas = \" &lt;&lt; std::get&lt;2&gt;(employee) &lt;&lt; std::endl;\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Buradaki kullan\u0131mlar\u0131n benzeri <em>std::pair<\/em> ve <em>std::array<\/em> i\u00e7in de ge\u00e7erlidir.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>struct<\/strong><strong> ile kullan\u0131m\u0131<\/strong><\/span><\/h2>\n<p><em>std::tuple<\/em>&#8216;a benzer \u015fekilde <em>struct<\/em> nesnelerinin de her bir eleman\u0131na bu mekanizma ile tek bir seferde ula\u015fabiliyoruz.<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;tuple&gt;\r\n\r\nstruct Employee\r\n{\r\n    std::string name;\r\n    std::string surname;\r\n    int age;\r\n    double height;\r\n};\r\n\r\nint main()\r\n{\r\n    Employee ahmet { \"Ahmet\", \"Can\", 35, 174.3 };\r\n\r\n    \/\/ Oncelikle calisan verileri tutmak icin degiskenleri tanimlayalim\r\n    std::string name;\r\n    std::string surname;\r\n    int age;\r\n    double height;\r\n    \r\n    \/\/ degerleri alalim\r\n    auto [ name, surname, age, height ] = ahmet;\r\n    std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<p>Bu kullan\u0131mlar\u0131n benzer \u015fekilde <em>struct<\/em> d\u00f6nen metotlarda da kullanabilirsiniz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Diziler<\/strong><strong> ile kullan\u0131m\u0131<\/strong><\/span><\/h2>\n<p>Yukar\u0131da anlat\u0131lan kullan\u0131mlar ile birlikte yap\u0131sal ba\u011flamaya geleneksel diziler ile de kullanabilirsiniz. A\u015fa\u011f\u0131da bu kullan\u0131ma ili\u015fki \u00f6rne\u011fi g\u00f6rebilirsiniz.<br \/>\nBurada \u00f6nemli olan ilgili dizinin boyutunun belli olmas\u0131.<\/p>\n<pre class=\"lang:c++ decode:true \">int arrayExample[] = { 47, 11 };\r\n\r\n\/\/ x ve y arrayExample elemanlar\u0131 ile doldurulur\r\nauto [x, y] = arr; \r\n\r\n\/\/ Derleme hatas\u0131 boyutlar farkl\u0131\r\nauto [z] = arr;<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>move semanti\u011fi<\/strong><strong> ile kullan\u0131m\u0131<\/strong><\/span><\/h2>\n<p>Yap\u0131sal ba\u011flama yukar\u0131da bahsetti\u011fim gibi move semanti\u011fi ile de kullan\u0131labilmektedir. A\u015fa\u011f\u0131da bu kullan\u0131ma ili\u015fkin \u00f6rnek kodu g\u00f6rebilirsiniz:<\/p>\n<pre class=\"lang:c++ decode:true \">Employee ms = { \"Ahmet\", \"Can\", 35, 174.5 };\r\n\r\n\/\/ \u0130lgili ms nesnesine rvalue referans\r\nauto&amp;&amp; [name, surname, age, height] = std::move(ms); \r\n\r\n\/\/ \"Ahmet Can\" bas\u0131l\u0131r\r\nstd::cout &lt;&lt; \"ms.name: \" &lt;&lt; ms.surname &lt;&lt; '\\n'; \r\n\r\n\/\/ \u0130smi de tasiyalim\r\nstd::string newName = std::move(name); \r\n\r\n\/\/ Degeri belli olmayan bir sey basilir (cunku tasindi yukar\u0131da)\r\nstd::cout &lt;&lt; \"ms.surname: \" &lt;&lt; ms.surname &lt;&lt; std::endl; \r\n\r\n\/\/ Benzer sekilde degeri belli olmayan bir sey basilir (cunku tasindi yukar\u0131da)\r\nstd::cout &lt;&lt; \"name: \" &lt;&lt; name &lt;&lt; std::endl; \r\n\r\n\/\/ Ali basilir\r\nstd::cout &lt;&lt; \"New name: \" &lt;&lt; newName &lt;&lt; std::endl;<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>std::map konteyneri<\/strong><strong> ile kullan\u0131m\u0131<\/strong><\/span><\/h2>\n<p>Bu mekanizman\u0131n bir di\u011fer kullan\u0131m\u0131 ise<em> std::map<\/em> konteynerinin elemanlar\u0131n\u0131n \u00fczerinde gezinme.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;unordered_map&gt;\r\n\r\ntemplate&lt;typename K, typename V&gt;\r\nvoid printMap(std::unordered_map&lt;K, V&gt; const &amp;m)\r\n{\r\n    for (auto const&amp; pair: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; pair.first &lt;&lt; \": \" &lt;&lt; pair.second &lt;&lt; \"}\\n\";\r\n    }\r\n}\r\n\r\nint main()\r\n{\r\n    std::unordered_map&lt;int, std::string&gt; m = \r\n    {\r\n        {1, \"Begum\"},\r\n        {8, \"Ahmet\"},\r\n        {3, \"Ayse\"}\r\n    };\r\n\r\n    \/\/ C++17 Oncesi\r\n    for (auto const&amp; pair: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; pair.first &lt;&lt; \": \" &lt;&lt; pair.second &lt;&lt; \"}\\n\";\r\n    }\r\n\r\n    \/\/ C++17 Sonras\u0131\r\n    \/\/ Daha anlasilir kullanim\r\n    for (auto&amp;&amp; [key, value]: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; key &lt;&lt; \": \" &lt;&lt; value &lt;&lt; \"}\\n\";\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/wg21.link\/p0217r3\"><strong>https:\/\/wg21.link\/p0217r3<\/strong><\/a><\/span><\/li>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0144r0.pdf\"><strong>http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0144r0.pdf<\/strong><\/a><\/span><\/li>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/skebanga.github.io\/structured-bindings\/\"><strong>https:\/\/skebanga.github.io\/structured-bindings\/<\/strong><\/a><\/span><\/li>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.bfilipek.com\/2017\/07\/cpp17-details-simplifications.html#structured-binding-declarations\"><strong>https:\/\/www.bfilipek.com\/2017\/07\/cpp17-details-simplifications.html#structured-binding-declarations<\/strong><\/a><\/span><\/li>\n<\/ul>\n<p>[:en]Hello everybody, we are together again with another weekly C++ post. In this post, we are going to take a look at a feature that provided with C++ 17, <em>&#8220;Structured Binding&#8221;<\/em>&#8216;. So what does this feature provide us? Briefly, this feature let you assign or initialize multiple variables with <code>tuple\/pair<\/code>or similar structs with one statement. It is now also possible to return multiple variables which were possible only via std::tuple like constructs. You may check out the references for more motivation behind this feature.<\/p>\n<p>Similar capabilites are provided as\u00a0<em>Unpacking, Multiple Assignment\u00a0<\/em>in other programming languages. For instance, in Python you can assign two variables with a single <code>(x, y) = 10, 20<\/code>statement. And now this is also possible with C++.<\/p>\n<p>In my post, instead of going through all details of this capability, I will try to give you some important usages of this capability with sample codes.<\/p>\n<h2><strong><span style=\"color: #3366ff;\">General syntax:<\/span><\/strong><\/h2>\n<p>Structured binding can be summarized with following syntax:<br \/>\n<span style=\"color: #ff0000;\">auto [element1, element2, &#8230;.] = { pair, tuple, struct or array\u00a0 }<\/span><\/p>\n<p>Points to consider:<\/p>\n<ul>\n<li>&#8220;element1, &#8230;, &#8221; the number of elements seperated with comma should be same as the ones provided at the right side of assignment operator,<\/li>\n<li>The element at the right side of assignment can be one of following:\n<ul>\n<li>std:: pair or std::tuple<\/li>\n<li>A struct instance. All of the struct members should be non-static. The order of definition is important,<\/li>\n<\/ul>\n<\/li>\n<li>Fixed size arrays,<\/li>\n<li>You may encounter with compilation error if one of above conditions is not met,<\/li>\n<li>To prevent any unnecessary copy operation, reference types should be used at the left side of assignment operator as much as possible,<\/li>\n<li><em><strong>auto, auto&amp;, const auto, const auto&amp;<\/strong><\/em>\u00a0and\u00a0<em><strong>auto&amp;&amp;<\/strong><\/em> can be used at the left side of assignment operator.<\/li>\n<\/ul>\n<h2><strong><span style=\"color: #3366ff;\">Usage with std::tuple:<\/span><\/strong><\/h2>\n<p>The first usage of structured binding will be about <em>tuple&#8217;s<\/em>. If you are using &#8220;std::pair&#8221; or &#8220;std::tuple&#8221; then you probably required to access the individual data. In fact,\u00a0<em>std::pair<\/em>\u00a0is an important part of <em>std::map<\/em>.<em> Std::tuple<\/em>\u00a0is a more generalized version of <em>std::pair<\/em>. Traditionally (before C++ 17), the approach to access the individual elements of <em>tuple <\/em>and assign them to other variables is perfomed through\u00a0<em>std::tie()<\/em> method. With structured binding, it is possible to use\u00a0<strong><span style=\"color: #ff0000;\">&#8220;auto [var1, var2, &#8230;] = tuple;&#8221;<\/span><\/strong>\u00a0to access corresponding variables. Let us look at an example usage:<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;tuple&gt;\r\n\r\nint main()\r\n{\r\n    auto employee = std::make_tuple(\"Ahmet\", \"Can\", 35, 174.3);\r\n\r\n    \/\/ Pre-C++ 17\r\n    \/\/ To access the tuple elements\r\n    {\r\n        \/\/ F\u0131rst define variables\r\n        std::string name;\r\n        std::string surname;\r\n        int age;\r\n        double height;\r\n        \r\n        std::tie(name, surname, age, height) = employee;\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ After C++ 17\r\n    {\r\n        auto [ name, surname, age, height ] = employee;\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Another issue with\u00a0<em>tuple<\/em>\u00a0usage is that it is not possible to get reference of elements with\u00a0<em>std::tie()<\/em>\u00a0method. Only way to do so is to use &#8220;<em>std::get&lt;2&gt;(employee)<\/em>&#8221; method. With this capability, this is also possible:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;tuple&gt;\r\n\r\nint main()\r\n{\r\n    auto employee = std::make_tuple(\"Ahmet\", \"Can\", 35, 174.3);\r\n\r\n    \/\/ Before C++ 17\r\n    \/\/ To obtain the references of tuple  elements\r\n    {\r\n        \/\/ First of all define variables\r\n        auto&amp; name = std::get&lt;0&gt;(employee);\r\n        auto&amp; surname = std::get&lt;1&gt;(employee);\r\n        auto&amp; age = std::get&lt;2&gt;(employee);\r\n        auto&amp; height = std::get&lt;2&gt;(employee);\r\n        \r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n        \/\/ Incremenet age\r\n        age++;\r\n\r\n        std::cout &lt;&lt; \"yeni yas = \" &lt;&lt; std::get&lt;2&gt;(employee) &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ After C++ 17\r\n    {\r\n        auto&amp; [ name, surname, age, height ] = tuple;\r\n\r\n        std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n        \/\/ Increment age\r\n        age++;\r\n\r\n        std::cout &lt;&lt; \"yeni yas = \" &lt;&lt; std::get&lt;2&gt;(employee) &lt;&lt; std::endl;\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Same usage is also possible for <em>std::pair<\/em> and\u00a0<em>std::array<\/em>.<\/p>\n<h2><strong><span style=\"color: #3366ff;\">Usage with struct:<\/span><\/strong><\/h2>\n<p>We can also access and assign each member of <em>struct<\/em>\u00a0objects similar to std::tuple.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;tuple&gt;\r\n\r\nstruct Employee\r\n{\r\n    std::string name;\r\n    std::string surname;\r\n    int age;\r\n    double height;\r\n};\r\n\r\nint main()\r\n{\r\n    Employee ahmet { \"Ahmet\", \"Can\", 35, 174.3 };\r\n\r\n    \/\/ Let us define variables to hold employee data\r\n    std::string name;\r\n    std::string surname;\r\n    int age;\r\n    double height;\r\n    \r\n    \/\/ obtain values\r\n    auto [ name, surname, age, height ] = ahmet;\r\n    std::cout &lt;&lt; \"name = \" &lt;&lt; name &lt;&lt; \" surname = \" &lt;&lt; surname &lt;&lt; \" age = \" &lt;&lt; age &lt;&lt; \" height = \" &lt;&lt; height &lt;&lt; \"cm\" &lt;&lt; std::endl;\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<p>This can also be used with functions that return <em>struct<\/em>.<\/p>\n<h2><strong><span style=\"color: #3366ff;\">Usage with arrays:<\/span><\/strong><\/h2>\n<p>The structured binding can also be used with traditional arrays. A sample code for this usage is provided below. It should be noted that the size of array should be matched.<\/p>\n<pre class=\"lang:c++ decode:true\">int arrayExample[] = { 47, 11 };\r\n\r\n\/\/ x and y is filled with arrayExample elements\r\nauto [x, y] = arr; \r\n\r\n\/\/ Compilation error. Sizes do not match\r\nauto [z] = arr;<\/pre>\n<h2><strong><span style=\"color: #3366ff;\">Usage with move semantics:<\/span><\/strong><\/h2>\n<p>As I mentioned above structured binding can also be used with move semantics. You can find a sample code that illustrate this usage:<\/p>\n<pre class=\"lang:c++ decode:true \">Employee ms = { \"Ahmet\", \"Can\", 35, 174.5 };\r\n\r\n\/\/ rvalue reference to ms object\r\nauto&amp;&amp; [name, surname, age, height] = std::move(ms); \r\n\r\n\/\/ \"Ahmet Can\" is printed\r\nstd::cout &lt;&lt; \"ms.name: \" &lt;&lt; ms.surname &lt;&lt; '\\n'; \r\n\r\n\/\/ Move name\r\nstd::string newName = std::move(name); \r\n\r\n\/\/ Invalid and nondetermined value is printed (we already moved value)\r\nstd::cout &lt;&lt; \"ms.surname: \" &lt;&lt; ms.surname &lt;&lt; std::endl; \r\n\r\n\/\/ Invalid and nondetermined value is also printed (we already moved value)\r\nstd::cout &lt;&lt; \"name: \" &lt;&lt; name &lt;&lt; std::endl; \r\n\r\n\/\/ Ali is printed\r\nstd::cout &lt;&lt; \"New name: \" &lt;&lt; newName &lt;&lt; std::endl;<\/pre>\n<h2><strong><span style=\"color: #3366ff;\">Usage with std::map:<\/span><\/strong><\/h2>\n<p>You can also use this mechanism with\u00a0<em>std::map<\/em>\u00a0container to traverse elements as illustrated below:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;unordered_map&gt;\r\n\r\ntemplate&lt;typename K, typename V&gt;\r\nvoid printMap(std::unordered_map&lt;K, V&gt; const &amp;m)\r\n{\r\n    for (auto const&amp; pair: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; pair.first &lt;&lt; \": \" &lt;&lt; pair.second &lt;&lt; \"}\\n\";\r\n    }\r\n}\r\n\r\nint main()\r\n{\r\n    std::unordered_map&lt;int, std::string&gt; m = \r\n    {\r\n        {1, \"Begum\"},\r\n        {8, \"Ahmet\"},\r\n        {3, \"Ayse\"}\r\n    };\r\n\r\n    \/\/ Before C++17\r\n    for (auto const&amp; pair: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; pair.first &lt;&lt; \": \" &lt;&lt; pair.second &lt;&lt; \"}\\n\";\r\n    }\r\n\r\n    \/\/ After C++17\r\n    \/\/ More clear and simple usage\r\n    for (auto&amp;&amp; [key, value]: m) \r\n    {\r\n        std::cout &lt;&lt; \"{\" &lt;&lt; key &lt;&lt; \": \" &lt;&lt; value &lt;&lt; \"}\\n\";\r\n    }\r\n\r\n    return 0;\r\n}<\/pre>\n<h2><span style=\"color: #3366ff;\"><strong>References:<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/wg21.link\/p0217r3\"><span style=\"color: #339966;\"><strong>https:\/\/wg21.link\/p0217r3<\/strong><\/span><\/a><\/li>\n<li><a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0144r0.pdf\"><span style=\"color: #339966;\"><strong>http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0144r0.pdf<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/skebanga.github.io\/structured-bindings\/\"><span style=\"color: #339966;\"><strong>https:\/\/skebanga.github.io\/structured-bindings\/<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.bfilipek.com\/2017\/07\/cpp17-details-simplifications.html#structured-binding-declarations\"><span style=\"color: #339966;\"><strong>https:\/\/www.bfilipek.com\/2017\/07\/cpp17-details-simplifications.html#structured-binding-declarations<\/strong><\/span><\/a><\/li>\n<\/ul>\n<p>[:]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[:tr]Merhabalar arkada\u015flar, yeni bir haftal\u0131k C++ yaz\u0131s\u0131 ile birlikteyiz. Bu yaz\u0131m\u0131zda da modern C++ 17 ile birlikte gelen bir di\u011fer kabiliyet olan &#8220;Structured Binding&#8221;&#8216;e bakaca\u011f\u0131z. Ben yaz\u0131mda buna k\u0131saca &#8220;yap\u0131sal ba\u011flama&#8221; diyece\u011fim. Bu kabiliyet bize ne kazand\u0131r\u0131yor? K\u0131saca bu kabiliyet ile birlikte birden fazla de\u011fi\u015fkenin tek bir ifade ile &#8220;tuple&#8221;\/&#8221;pair&#8221; ya da benzeri yap\u0131lar\u0131 kullanarak&#8230; <a class=\"more-link\" href=\"https:\/\/yazilimperver.com\/index.php\/2018\/11\/09\/haftalik-c-4-yapisal-baglama-structured-binding\/\">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":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"0","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","dsgo_overlay_header":false,"dsgo_overlay_header_text_color":"","dsgo_overlay_skip_top_bar":false,"_designsetgo_exclude_llms":false,"footnotes":""},"categories":[10,41,188],"tags":[13,234,241,42,105,240,238,203,239],"class_list":["post-610","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","category-yazilim-muhendisligi","tag-c","tag-c-17","tag-haftalik","tag-modern-c","tag-stdmove","tag-stdtie","tag-structured-binding","tag-weekly","tag-yapisal-baglama"],"_links":{"self":[{"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/610","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=610"}],"version-history":[{"count":0,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/610\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=610"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=610"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=610"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}