{"id":2156,"date":"2021-04-27T21:26:46","date_gmt":"2021-04-27T21:26:46","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2156"},"modified":"2021-04-27T21:26:46","modified_gmt":"2021-04-27T21:26:46","slug":"haftalik-c-37-degisken-sablonlar-variadic-templates","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/","title":{"rendered":"Haftal\u0131k C++ 37 &#8211; De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)"},"content":{"rendered":"<p>Evet arkada\u015flar uzun bir s\u00fcredir radar\u0131mda olan fakat bir t\u00fcrl\u00fc yaz\u0131ya d\u00f6kemedi\u011fim bir konu olan de\u011fi\u015fken \u015fablonlar (&#8220;variadic templates&#8221;)\u00a0 konusuna bak\u0131yor olaca\u011f\u0131z. Kabiliyet her ne kadar C++ 11 ile sunulmu\u015f olsa da sonraki C++ standartlar\u0131nda da, bir tak\u0131m g\u00fcncellemelere\u00a0 ve ilavelere tabi olmu\u015f. Bu kabiliyeti asl\u0131nda &#8220;template metaprogramming&#8221; ile u\u011fra\u015fan arkada\u015flar muhtemelen olduk\u00e7a s\u0131k kullan\u0131yorlard\u0131r, a\u00e7\u0131k\u00e7as\u0131 ben de her ne kadar ne i\u015fe yarad\u0131\u011f\u0131n\u0131 bilsem de, \u00e7ok fazla bu kabiliyeti kullanmad\u0131m. O sebeple burada \u00e7ok detayl\u0131 bir inceleme bekliyorsan\u0131z, sizi ba\u015ftan uyaray\u0131m. Fakat bunu, daha ileri seviye kullan\u0131mlar\u0131 i\u00e7in ilk basamak olarak g\u00f6rebilirsiniz \ud83d\ude09<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>\u015eablonlara (&#8220;templates&#8221;) K\u0131sa Bir Bak\u0131\u015f<\/strong><\/span><\/h2>\n<p>As\u0131l konuya dalmadan \u00f6nce, h\u0131zl\u0131ca &#8220;template&#8221; lar nas\u0131l \u00e7al\u0131\u015f\u0131yora bakmakta fayda var diye d\u00fc\u015f\u00fcn\u00fcyorum. Bu ba\u011flamda da, hemen bir \u00f6rnek ile olaya girelim. \u00d6rne\u011fin, elimizde tam say\u0131lar\u0131 toplamak i\u00e7in kulland\u0131\u011f\u0131m\u0131 olduk\u00e7a sofistike bir fonksiyon oldu\u011funu d\u00fc\u015f\u00fcnelim:<\/p>\n<pre class=\"lang:c++ decode:true\">int32_t Topla(int32_t argLeft, int32_t argRight)\r\n{\r\n       return argLeft + argRight;\r\n}<\/pre>\n<p>\u015eimdi bunun benzerine float say\u0131lar i\u00e7in de ihtiya\u00e7 duydu\u011fumuzu d\u00fc\u015f\u00fcnelim ne yapaca\u011f\u0131z? Ya benzer bir fonksiyonu float i\u00e7in de tan\u0131mlayaca\u011f\u0131z ya da &#8220;template&#8221;\u00a0 lar\u0131 kullanaca\u011f\u0131z. Nas\u0131l m\u0131? Hemen bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n\r\ntemplate &lt;typename T&gt;\r\nT Topla(T argLeft, T argRight) \r\n{ \r\n     return argLeft + argRight; \r\n}\r\n\r\nint main(){\r\n     std::cout &lt;&lt; \"3 + 5 = \" &lt;&lt; Topla(3, 5) &lt;&lt; '\\n'; \r\n     std::cout &lt;&lt; \"3.3F + 5.3F = \" &lt;&lt; Topla(3.3, 5.5) &lt;&lt; '\\n'; \r\n\r\n     return 0;\r\n}<\/pre>\n<p>Evet g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi tek bir tan\u0131mlama ile birden fazla tip i\u00e7in olduk\u00e7a sofistike bir toplama kabiliyeti elde etmi\u015f olduk. Peki arka planda ne oluyor? Bunu hi\u00e7 merak ettiniz mi? Hemen bakal\u0131m. Bunun i\u00e7in de, uzun bir s\u00fcredir kulland\u0131\u011f\u0131m <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/gcc.godbolt.org\/\">https:\/\/gcc.godbolt.org\/<\/a><\/strong><\/span> sitesini kullanaca\u011f\u0131z. Bu site arac\u0131l\u0131\u011f\u0131 ile yazm\u0131\u015f oldu\u011funuz koda ili\u015fkin \u00fcretilen makine kodunu (&#8220;assembly&#8221;) farkl\u0131 derleyiciler i\u00e7in g\u00f6rebiliyorsunuz, daha da g\u00fczeli, sunulan renklendirme ile sat\u0131rlar aras\u0131 ili\u015fki kurman\u0131za da olanak sa\u011fl\u0131yor. Hemen ilk toplama i\u015flemi i\u00e7in x86\/64 Clang 11 \u00e7\u0131kt\u0131s\u0131na bakal\u0131m (ilgili olmayan k\u0131s\u0131mlar\u0131 \u00e7\u0131kard\u0131m fakat merak eden okuyucular\u0131m, ilgili sitede tam haline bakabilir):<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Orjinal kodumuz\r\nint32_t Topla(int32_t argLeft, int32_t argRight) \r\n{\r\n     return argLeft + argRight; \r\n}\r\n\r\n\/\/ Makine kodu kar\u015f\u0131l\u0131\u011f\u0131\r\nTopla(int, int):                             # @Topla(int, int)\r\n        push    rbp\r\n        mov     rbp, rsp\r\n        mov     dword ptr [rbp - 4], edi\r\n        mov     dword ptr [rbp - 8], esi\r\n        mov     eax, dword ptr [rbp - 4]\r\n        add     eax, dword ptr [rbp - 8]\r\n        pop     rbp\r\n        ret<\/pre>\n<p>\u015eimdi ayn\u0131 kodun &#8220;template&#8221; lar kullan\u0131larak yaz\u0131lan haline bakal\u0131m<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Kodumuz\r\ntemplate &lt;typename T&gt; T Topla(T argLeft, T argRight) \r\n{ \r\n    return argLeft + argRight; \r\n}\r\n\r\nint main()\r\n{\r\n    Topla(3, 5);\r\n    return 0;\r\n}\r\n\r\n\/\/ Makine kodu kar\u015f\u0131l\u0131\u011f\u0131\r\nint Topla&lt;int&gt;(int, int):                    # @int Topla&lt;int&gt;(int, int)\r\n        push    rbp\r\n        mov     rbp, rsp\r\n        mov     dword ptr [rbp - 4], edi\r\n        mov     dword ptr [rbp - 8], esi\r\n        mov     eax, dword ptr [rbp - 4]\r\n        add     eax, dword ptr [rbp - 8]\r\n        pop     rbp\r\n        ret<\/pre>\n<p>Burada <em>main<\/em> i\u00e7erisinde \u00f6rnek bir kullan\u0131m ekledim, \u00e7\u00fcnk\u00fc aksi halde template&#8217;a kar\u015f\u0131l\u0131k gelen kod \u00fcretilmeyecekti. Peki, iki kod aras\u0131ndaki fark\u0131 g\u00f6rebiliyor musunuz? G\u00f6remiyor olman\u0131z laz\u0131m \u00e7\u00fcnk\u00fc ikisi de asl\u0131nda ayn\u0131 kodu \u00fcretiyor. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere asl\u0131nda arka planda, derleyici sizin i\u00e7in yine benzer bir kod \u00fcretti. \u015eimdi kayan say\u0131lar\u0131 kullanan halini de ekleyelim main i\u00e7erisine bakal\u0131m \u015fimdi ne \u00fcretecek:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Kodumuz\r\ntemplate &lt;typename T&gt; T Topla(T argLeft, T argRight) \r\n{ \r\n    return argLeft + argRight; \r\n}\r\n\r\nint main()\r\n{\r\n    Topla(3, 5);\r\n    Topla(3.0F, 5.0F);\r\n    return 0;\r\n}\r\n\r\n\/\/ Uretilen kod\r\nint Topla&lt;int&gt;(int, int):                    # @int Topla&lt;int&gt;(int, int)\r\n        push    rbp\r\n        mov     rbp, rsp\r\n        mov     dword ptr [rbp - 4], edi\r\n        mov     dword ptr [rbp - 8], esi\r\n        mov     eax, dword ptr [rbp - 4]\r\n        add     eax, dword ptr [rbp - 8]\r\n        pop     rbp\r\n        ret\r\nfloat Topla&lt;float&gt;(float, float):                    # @float Topla&lt;float&gt;(float, float)\r\n        push    rbp\r\n        mov     rbp, rsp\r\n        movss   dword ptr [rbp - 4], xmm0\r\n        movss   dword ptr [rbp - 8], xmm1\r\n        movss   xmm0, dword ptr [rbp - 4]       # xmm0 = mem[0],zero,zero,zero\r\n        addss   xmm0, dword ptr [rbp - 8]\r\n        pop     rbp\r\n        ret\r\n<\/pre>\n<p>Umar\u0131m yeni eklenen sat\u0131rlar\u0131ndan neden kaynakland\u0131\u011f\u0131n\u0131 anlam\u0131\u015fs\u0131n\u0131zd\u0131r. Kayan say\u0131 i\u00e7in de derleyici, arka planda yeni bir fonksiyon bizler i\u00e7in tan\u0131mlam\u0131\u015f oldu. Burada, akl\u0131n\u0131za derleyici ne zamana kadar bunlar\u0131 \u00fcretecek sorusu gelebilir. Kodunuz i\u00e7erisindeki kullan\u0131m miktar\u0131 kadar. Eee, bu kodu b\u00fcy\u00fctmez mi? B\u00fcy\u00fct\u00fcr. Peki bize s\u0131k\u0131nt\u0131 yarat\u0131r m\u0131? Yaratabilir. Keza, emniyet kritik yaz\u0131l\u0131mlar i\u00e7in takip edilen kodlama standartlar\u0131nda, b\u00fct\u00fcn olas\u0131 kullan\u0131mlar\u0131n ba\u015fta tan\u0131mlanmas\u0131 zorunlu k\u0131l\u0131n\u0131r. Bizim durumumuzda, kodunuzun bir yerinde a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 tan\u0131mlanm\u0131\u015f olman\u0131z gerekiyor, bu da derleyicinin ilgili kodlar\u0131 \u00fcretmesini tetikleyecektir (hemen deneyebilirsiniz \ud83d\ude09 :<\/p>\n<pre class=\"lang:c++ decode:true\">template float Topla&lt;float&gt;(float, float);\r\ntemplate int32_t Topla&lt;int32_t&gt;(int32_t, int32_t);<\/pre>\n<p>Bu noktada, asl\u0131nda &#8220;template&#8221; mekanizmas\u0131 ile uygun fonksiyonlar\u0131n derleme zaman\u0131nda nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131 ve kullan\u0131m\u0131n\u0131n nas\u0131l oldu\u011funu san\u0131r\u0131m art\u0131k g\u00f6rm\u00fc\u015f olduk. Daha detayl\u0131 bilgiler i\u00e7in herhangi bir C++ kayna\u011f\u0131na ba\u015fvurabilirsiniz.<\/p>\n<p>\u015eimdi gelelim as\u0131l konumuza.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)<\/span><\/strong><\/h2>\n<p>Uzun laf\u0131n k\u0131sas\u0131, de\u011fi\u015fken \u015fablonlar bize, s\u0131f\u0131r ya da herhangi bir say\u0131da \u015fablon arg\u00fcman\u0131 alan s\u0131n\u0131f ya da fonksiyon \u015fablonlar\u0131 tan\u0131mlamam\u0131za olanak sa\u011flarlar. Peki daha \u00f6nce bu yap\u0131lam\u0131yor muydu? G\u00fczel soru, evet yap\u0131labiliyordu, fakat ilgili durumda en fazla adet kadar arg\u00fcman yine de tan\u0131mlanmas\u0131 gerekiyordu. \u00d6rne\u011fin, bir tuple \u015fablon s\u0131n\u0131f\u0131n\u0131 bu \u015fekilde tan\u0131mlayacak olsak nas\u0131l yapard\u0131k? \u0130\u015fte s\u00f6yle:<\/p>\n<pre class=\"lang:c++ decode:true\">struct Unused;\r\ntemplate&lt;typename T1 = Unused, typename T2 = Unused,\r\ntemplate&lt;typename T3 = Unused, typename T4 = Unused,\r\ntemplate&lt;\/\u2217 up to \u2217\/ typename TN = Unused&gt; \r\nclass Tuple;<\/pre>\n<p>Bu tan\u0131mlama ile N adete kadar arg\u00fcman alan <em>Tuple<\/em> s\u0131n\u0131f\u0131 tan\u0131mlayabilirsiniz. \u00d6r:<\/p>\n<pre class=\"lang:c++ decode:true\">typedef Tuple&lt;char, short, int, long, long long&gt; tupleIntegralSet;<\/pre>\n<p>Ya da ilgili adete g\u00f6re a\u015fa\u011f\u0131daki gibi kullan\u0131mlar da mevcut:<\/p>\n<pre class=\"lang:c++ decode:true \">template&lt;&gt;\r\nclass Tuple&lt;&gt; { \/\u2217 Hi\u00e7 arg\u00fcman olmamas\u0131 durumu. \u2217\/ };\r\n\r\ntemplate&lt;typename T1&gt;\r\nclass Tuple&lt;T1&gt; { \/\u2217 Tek arg\u00fcman olmas\u0131 durumu. \u2217\/ };\r\n\r\ntemplate&lt;typename T1, typename T2&gt;\r\nclass Tuple&lt;T1, T2&gt; { \/\u2217 \u0130ki arg\u00fcman olmas\u0131 durumu. \u2217\/ };<\/pre>\n<p>Yukar\u0131daki \u00f6rneklerden de g\u00f6rebilece\u011finiz \u00fczere, bu tarz bir kabiliyet i\u00e7in hem bir \u00e7ok kod yazmak gerekiyor, ilaveten burada yap\u0131lacak hatalara ili\u015fkin hata mesajlar\u0131 da pek insanc\u0131l olmayabilir \ud83d\ude42 Bir de elbette bu arg\u00fcman say\u0131s\u0131na ili\u015fkin bir limit de olacak.<\/p>\n<p>\u0130\u015fte de\u011fi\u015fken \u015fablonlar bize, yukar\u0131daki Tuple \u00f6rne\u011fini \u00e7ok daha kolay ve anla\u015f\u0131labilir \u015fekilde a\u015fa\u011f\u0131daki gibi tan\u0131mlamam\u0131za izin veriyor:<\/p>\n<pre class=\"lang:c++ decode:true\">template&lt;typename...Args&gt; \r\nclass Tuple;<\/pre>\n<p>Bu tan\u0131mlama asl\u0131nda yukar\u0131da yapt\u0131\u011f\u0131m\u0131z tan\u0131mlama ile ayn\u0131 \u015feyi elde edebiliyoruz.<\/p>\n<p>\u015eimdi gelelim yukar\u0131daki tan\u0131mlamalara ili\u015fkin hususlara.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Parametre Paketi (&#8220;Parameter Pack&#8221;)<\/strong><\/span><\/h3>\n<p>\u00d6ncelikle, <em>Args <\/em>ibaresinin hemen solundaki &#8220;&#8230;&#8221; ya bakal\u0131m (&#8220;ellipsis&#8221;). Buna <em>\u015fablon tip parametre paketi<\/em> deniliyor (&#8220;<em><strong>template type parameter pack<\/strong><\/em>&#8220;), <em>Args<\/em> ise paket ismi olarak ifade edilmektedir. Parametre paketi (<strong>&#8220;Parameter Pack&#8221;),<\/strong> C++ 11 de\u011fi\u015fken \u015fablonlar ile sunulan bir yap\u0131d\u0131r. Normalde tek bir arg\u00fcmana kar\u015f\u0131l\u0131k gelen parametrelerin aksini, bu yap\u0131 ile birden fazla arg\u00fcman tek bir parametre paketi haline getirilebilmektedir.<\/p>\n<p>\u00d6rne\u011fin, yukar\u0131da verdi\u011fimiz &#8220;<em>typedef tuple&lt;char, short, int, long, long long&gt; integral types;<\/em>&#8221; ile paketlenen parametreler nelerdir? \u015eunlar: char, short, int, long, long long.<\/p>\n<p>Bu arada, bu parametre paketi i\u00e7erisine sadece \u015fablon tipleri de\u011fil, tip olmayan parametreler ve \u015fablon\/\u015fablon parametrelerin kullan\u0131mlar\u0131 da m\u00fcmk\u00fcn. Hemen \u00f6rneklere bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Tip \u015fablon parametre paketi kullan\u0131m\u0131na \u00f6rnek\r\ntemplate&lt;class...Args&gt; class X{};\r\n\r\nX&lt;&gt; a;                    \/\/ Bo\u015f parametre listesi\r\nX&lt;int&gt; b;                 \/\/ Tek parametreli liste\r\nX&lt;int, char, float&gt; c;    \/\/ \u00dc\u00e7 parametreli liste\r\n\r\n\/\/ Tip olmayan \u015fablon parametre paketi kullan\u0131m\u0131na \u00f6rnek\r\ntemplate&lt;bool...Args&gt; class X{};\r\n\r\nX&lt;&gt; a;                     \/\/ Bo\u015f parametre listesi\r\nX&lt;true&gt; b;                 \/\/ Tek parametreli liste\r\nX&lt;true, false, true&gt; c;    \/\/ \u00dc\u00e7 parametreli liste\r\n\r\n\/\/ \u015eablon \u015fablon parametre paket kullan\u0131m\u0131na \u00f6rnek\r\ntemplate &lt;template &lt;class T&gt;... class U&gt; \/\/ U \u015fablon \u015fablon parametresine \u00f6rnektir. Daha detayl\u0131 \u00f6rnekler \u015fimdilik beni a\u015f\u0131yor :) ama kaynaklarda bunlara ili\u015fkin \u00f6rnekler mevcut.<\/pre>\n<p>Peki fonksiyon \u015fablonlar\u0131nda, parametre paketi kullan\u0131m\u0131 nas\u0131l oluyor. Ona da bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">template&lt;class...A&gt; void exampleFunc(A...Args) \r\n\r\nexampleFunc();                  \/\/ void exampleFunc(); \r\nexampleFunc(1);                 \/\/ void exampleFunc(int); \r\nexampleFunc(1,2,3,4,5);         \/\/ void exampleFunc(int,int,int,int,int);\r\nexampleFunc(1,'x', aWidget);    \/\/ void exampleFunc(int,char,widget);<\/pre>\n<p>Yukar\u0131da bahsetti\u011fimiz kullan\u0131mlara benzer \u015fekilde, 0 ya da daha fazla arg\u00fcman ile ilgili fonksiyon \u00e7a\u011fr\u0131labilmektedir. Ayr\u0131ca, tek \u015fablon parametreleri ile yukar\u0131da bahsetti\u011fim parametre paketleri de birlikte kullan\u0131labilmektedir. Burada \u015f\u00f6yle bir k\u0131s\u0131t var, sadece bir parametre paketi olarak ve bu da en sonda tan\u0131mlanmal\u0131d\u0131r. \u00d6r:<\/p>\n<pre class=\"lang:c++ decode:true\">template &lt;class X, bool B, class... Args&gt;<\/pre>\n<p>Burada bahsetmek istedi\u011fim bir konu daha var. \u00d6zellikle, bu parametre paketlerini isimlendirirken, \u00e7o\u011ful bir isim ya da birden fazla parametreyi ifade eden bir kullan\u0131m olmas\u0131nda fayda olabilir.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Paket Geni\u015fletme (&#8220;Pack Expansion&#8221;)<\/strong><\/span><\/h3>\n<p>Buraya kadar parametre paketlerinin nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck, g\u00fczel, peki bunu nas\u0131l kullanaca\u011f\u0131z? Daha \u00f6nce de ifade etti\u011fimiz \u00fczere, bu parametre paketi asl\u0131nda, virg\u00fcl ile ayr\u0131lan ve tek tek tan\u0131mlamalar\u0131 i\u00e7eren bir liste haline gelmektedir. G\u00fczel de bunu, \u00f6rne\u011fin, fonksiyonlara nas\u0131l ge\u00e7irece\u011fiz? Bunun i\u00e7in de, paket ismi + &#8220;&#8230;&#8221; kullan\u0131m\u0131na ba\u015fvuruyoruz. Evet, zihninizde tam netle\u015fmemi\u015f olabilir, o sebeple hemen bir \u00f6rnek ile bu kullan\u0131ma bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">template &lt;class<strong>... Args<\/strong>&gt;\r\nvoid func(int i, <strong>Args...<\/strong> args) \r\n{\r\n  \/\/ \u00d6nce parametre paket ismini koyal\u0131m, sonra da ... ekleyelim\r\n  std::tuple&lt;Args...&gt; argsTuple{ args... }; \r\n}\r\n\r\n\/\/ \u0130lk kullan\u0131m\r\nfunc(15, 3.14F, \"stringExample\", 100);\r\n\r\n\/\/ \u0130kinci kullan\u0131m\r\nfunc(15);<\/pre>\n<p>Burada, <em>func(15, 3.14F, &#8220;stringExample&#8221;, 100)<\/em> \u00e7a\u011fr\u0131s\u0131 ile ilgili parametre tiplerine ili\u015fkin std::tuple&#8217;\u0131 a\u00e7\u0131k bir \u015fekilde tan\u0131mlamadan, ilgili parametre paketini geni\u015fleterek tan\u0131mlamas\u0131n\u0131 sa\u011fl\u0131yoruz. Yani asl\u0131nda ne tan\u0131mlad\u0131k? Tam olarak a\u015fa\u011f\u0131dakini (dikkat ilk parametre olan <em>int,<\/em> pakete dahil de\u011fil):<\/p>\n<pre class=\"lang:c++ decode:true\">void func(int i, float args_1, char const* args_2, int args_3) \r\n{\r\n  std::tuple&lt;float, char const*, int&gt; argsTuple{args_1, args_2, args_3};\r\n  \/\/...\r\n}<\/pre>\n<p>\u0130kinci kullan\u0131m, yukar\u0131da bahsetti\u011fim asl\u0131nda s\u0131f\u0131r parametre kullan\u0131m durumunu tariflemektedir. Peki bu\u00a0 durumda nas\u0131l bir kod \u00fcretiliyor?<\/p>\n<pre class=\"lang:c++ decode:true \">template&lt;&gt;\r\nvoid func(int i \/* sonras\u0131 yok *\/)\r\n{\r\n  \/\/ Bo\u015f bir tuple :)\r\n  std::tuple&lt;&gt; argsTuple{}; \r\n}<\/pre>\n<p>Tabi, bunu yapabilmek i\u00e7in bir \u015feye daha ihtiyac\u0131m\u0131z var. Nedir peki o? tuple&#8217;\u0131n da bu \u015fekilde tan\u0131mlanm\u0131\u015f olmas\u0131. Hemen bakal\u0131m nas\u0131l tan\u0131mlanm\u0131\u015f:<\/p>\n<pre class=\"lang:c++ decode:true\">template&lt; class... Types &gt;\r\nclass tuple;<\/pre>\n<p>\u0130\u015fte bu sayede, bu kullan\u0131m m\u00fcmk\u00fcn olmaktad\u0131r.<\/p>\n<p>\u00d6zet olarak bu kullan\u0131mlar\u0131 a\u015fa\u011f\u0131daki \u00f6rnek ile de \u00f6zetleyebiliriz:<\/p>\n<pre class=\"lang:c++ decode:true\">template&lt;class...Args&gt; void func1(Args...a){};\r\n\r\ntemplate&lt;class...Args&gt; void func2(Args...b){\r\n    func1(b...);\r\n}<\/pre>\n<p>Peki bunlar d\u0131\u015f\u0131nda bu paket geni\u015fletme nerelerde kullan\u0131labilir. A\u015fa\u011f\u0131da bunlar\u0131 s\u0131ralamaya \u00e7al\u0131\u015ft\u0131m:<\/p>\n<ul>\n<li>Fonksiyon arg\u00fcman listeleri (arg\u00fcman olarak ge\u00e7irilmesi),<\/li>\n<li>\u015eablon arg\u00fcman listeleri (\u015fablon arg\u00fcman\u0131 olarak ge\u00e7irilmesi),<\/li>\n<li>Parantez ilklendirmeleri &#8220;()&#8221;,<\/li>\n<li>K\u00fcme ayra\u00e7l\u0131 ilklendirmeler &#8220;{}&#8221;<\/li>\n<li>Fonksiyon \u015fablon parametre listeleri,<\/li>\n<li>\u015eablon parametre listeleri,<\/li>\n<li>\u00dcst veya \u00fcye ilklendirme listeleri,<\/li>\n<li>Lambda ifadeleri,<\/li>\n<li>\u0130stisna (&#8220;exception&#8221;) tan\u0131mlamalar\u0131,<\/li>\n<li>sizeof&#8230; operat\u00f6r\u00fc<\/li>\n<\/ul>\n<p>Her birine ili\u015fkin detayl\u0131 a\u00e7\u0131klama ve \u00f6rneklere ise <span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/parameter_pack\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/parameter_pack<\/strong><\/a><\/span> adresinden ula\u015fabilirsiniz. Yukar\u0131dakilerden \u00f6zellikle &#8220;<strong>sizeof&#8230;<\/strong>&#8221; a de\u011finmek istiyorum bu konuyu kapatmadan.<\/p>\n<p><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/sizeof...\"><span style=\"color: #008000;\"><strong>sizeof&#8230;<\/strong><\/span><\/a>&#8216;da di\u011fer paket geni\u015fletme kullan\u0131mlar\u0131ndan birisidir. Basit\u00e7e, ilgili paketin ka\u00e7 elemandan olu\u015ftu\u011funu d\u00f6ner. Burada \u00e7al\u0131\u015fma zaman\u0131nda boyut bilgisini d\u00f6nen sizeof aksine, <strong>sizeof&#8230;<\/strong>, derleme zaman\u0131nda olu\u015fturulan bir sabit d\u00f6ner. Hemen bir \u00f6rne\u011fe bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">template &lt;typename... Args&gt;\r\nvoid func(Args... args)\r\n{\r\n    std::cout &lt;&lt; \"Dizi boyutu: \" &lt;&lt; sizeof...(args) &lt;&lt; '\\n';\r\n\r\n    \/\/ Ge\u00e7ilen arg\u00fcman adeti kadar uzunlukta bir dizi olu\u015ftural\u0131m\r\n    int argsTable[sizeof...(args)] = {args...}; \r\n\r\n}<\/pre>\n<p>Arkada\u015flar, san\u0131r\u0131m de\u011fi\u015fken \u015fablonlar\u0131n ne oldu\u011fu ve nas\u0131l kullan\u0131labilece\u011fine ili\u015fkin sizlere az da olsa bir fikir verebildiysem ne mutlu. Elbette konu olduk\u00e7a derin, ayr\u0131ca C++ 17 ile de bir tak\u0131m eklemeler yap\u0131lm\u0131\u015f (&#8220;fold expressions&#8221;), buna da in\u015fallah sonraki yaz\u0131lar\u0131mdan birisinde de\u011finece\u011fim. Bu arada bu konuya ili\u015fkin ek bilgi edinmek isteyen yaz\u0131l\u0131mperver dostlar\u0131m\u0131 kaynaklarda verdi\u011fimi video ve di\u011fer kaynaklar\u0131 incelemeye davet ediyorum.<\/p>\n<p>Bu kabiliyet ile birlikte bir C++ 11 \u00f6zelli\u011finin \u00fczerine de \u00e7iz\u0131k at\u0131yoruz. Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle, bol kodlu g\u00fcnler \ud83d\ude42<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/parameter_pack\">https:\/\/en.cppreference.com\/w\/cpp\/language\/parameter_pack<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.ibm.com\/docs\/en\/i\/7.3?topic=c11-pack-expansion\">https:\/\/www.ibm.com\/docs\/en\/i\/7.3?topic=c11-pack-expansion<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/sizeof...\">https:\/\/en.cppreference.com\/w\/cpp\/language\/sizeof&#8230;<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/kubasejdak.com\/techniques-of-variadic-templates\">https:\/\/kubasejdak.com\/techniques-of-variadic-templates<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/lbrandy.com\/blog\/2013\/03\/variadic_templates\/\">http:\/\/lbrandy.com\/blog\/2013\/03\/variadic_templates\/<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.youtube.com\/watch?v=o1EvPhz6UNE\">https:\/\/www.youtube.com\/watch?v=o1EvPhz6UNE<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.youtube.com\/watch?v=R1G3P5SRXCw\">https:\/\/www.youtube.com\/watch?v=R1G3P5SRXCw<\/a><\/strong><\/span><\/li>\n<li><a href=\"https:\/\/arne-mertz.de\/2016\/11\/modern-c-features-variadic-templates\/\"><span style=\"color: #008000;\"><strong>https:\/\/arne-mertz.de\/2016\/11\/modern-c-features-variadic-templates\/<\/strong><\/span><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Evet arkada\u015flar uzun bir s\u00fcredir radar\u0131mda olan fakat bir t\u00fcrl\u00fc yaz\u0131ya d\u00f6kemedi\u011fim bir konu olan de\u011fi\u015fken \u015fablonlar (&#8220;variadic templates&#8221;)\u00a0 konusuna bak\u0131yor olaca\u011f\u0131z. Kabiliyet her ne kadar C++ 11 ile sunulmu\u015f olsa da sonraki C++ standartlar\u0131nda da, bir tak\u0131m g\u00fcncellemelere\u00a0 ve ilavelere tabi olmu\u015f. Bu kabiliyeti asl\u0131nda &#8220;template metaprogramming&#8221; ile u\u011fra\u015fan arkada\u015flar muhtemelen olduk\u00e7a s\u0131k kullan\u0131yorlard\u0131r,&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\">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":[46,859,42,861,860,856,857,858],"class_list":["post-2156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c-11","tag-compiler-explorer","tag-modern-c","tag-parameter-expansion","tag-parameter-pack","tag-template-type-parameter-pack","tag-templates","tag-variadic-templates"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (&quot;Variadic Templates&quot;) - 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\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (&quot;Variadic Templates&quot;) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet arkada\u015flar uzun bir s\u00fcredir radar\u0131mda olan fakat bir t\u00fcrl\u00fc yaz\u0131ya d\u00f6kemedi\u011fim bir konu olan de\u011fi\u015fken \u015fablonlar (&#8220;variadic templates&#8221;)\u00a0 konusuna bak\u0131yor olaca\u011f\u0131z. Kabiliyet her ne kadar C++ 11 ile sunulmu\u015f olsa da sonraki C++ standartlar\u0131nda da, bir tak\u0131m g\u00fcncellemelere\u00a0 ve ilavelere tabi olmu\u015f. Bu kabiliyeti asl\u0131nda &#8220;template metaprogramming&#8221; ile u\u011fra\u015fan arkada\u015flar muhtemelen olduk\u00e7a s\u0131k kullan\u0131yorlard\u0131r,... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-27T21:26:46+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=\"12 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\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 37 &#8211; De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)\",\"datePublished\":\"2021-04-27T21:26:46+00:00\",\"dateModified\":\"2021-04-27T21:26:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\"},\"wordCount\":1624,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"C++ 11\",\"compiler explorer\",\"Modern C++\",\"parameter expansion\",\"parameter pack\",\"template type parameter pack\",\"templates\",\"variadic templates\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\",\"name\":\"Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (\\\"Variadic Templates\\\") - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2021-04-27T21:26:46+00:00\",\"dateModified\":\"2021-04-27T21:26:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 37 &#8211; De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)\"}]},{\"@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":"Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (\"Variadic Templates\") - 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\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/","og_locale":"tr_TR","og_type":"article","og_title":"Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (\"Variadic Templates\") - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet arkada\u015flar uzun bir s\u00fcredir radar\u0131mda olan fakat bir t\u00fcrl\u00fc yaz\u0131ya d\u00f6kemedi\u011fim bir konu olan de\u011fi\u015fken \u015fablonlar (&#8220;variadic templates&#8221;)\u00a0 konusuna bak\u0131yor olaca\u011f\u0131z. Kabiliyet her ne kadar C++ 11 ile sunulmu\u015f olsa da sonraki C++ standartlar\u0131nda da, bir tak\u0131m g\u00fcncellemelere\u00a0 ve ilavelere tabi olmu\u015f. Bu kabiliyeti asl\u0131nda &#8220;template metaprogramming&#8221; ile u\u011fra\u015fan arkada\u015flar muhtemelen olduk\u00e7a s\u0131k kullan\u0131yorlard\u0131r,... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2021-04-27T21:26:46+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":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 37 &#8211; De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)","datePublished":"2021-04-27T21:26:46+00:00","dateModified":"2021-04-27T21:26:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/"},"wordCount":1624,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["C++ 11","compiler explorer","Modern C++","parameter expansion","parameter pack","template type parameter pack","templates","variadic templates"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/","name":"Haftal\u0131k C++ 37 - De\u011fi\u015fken \u015eablonlar (\"Variadic Templates\") - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2021-04-27T21:26:46+00:00","dateModified":"2021-04-27T21:26:46+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/04\/27\/haftalik-c-37-degisken-sablonlar-variadic-templates\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 37 &#8211; De\u011fi\u015fken \u015eablonlar (&#8220;Variadic Templates&#8221;)"}]},{"@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\/2156","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=2156"}],"version-history":[{"count":12,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2156\/revisions"}],"predecessor-version":[{"id":2195,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2156\/revisions\/2195"}],"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=2156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}