{"id":1538,"date":"2019-11-24T20:46:45","date_gmt":"2019-11-24T20:46:45","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=1538"},"modified":"2019-11-24T20:47:33","modified_gmt":"2019-11-24T20:47:33","slug":"uzay-gemisi-operatoru-stdsource_location-ve-template","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/","title":{"rendered":"Haftal\u0131k C++ 21 &#8211; Uzay gemisi operat\u00f6r\u00fc &#8220;<=>&#8220;, std::source_location ve template<std::basic_fixed_string T>"},"content":{"rendered":"<p>SOLID yaz\u0131lar\u0131m\u0131z\u0131 da bitirdi\u011fimize g\u00f6re art\u0131k biraz C++ a d\u00f6n\u00fc\u015f yapabiliriz. Bu yaz\u0131mda C++ 20 standard\u0131 i\u00e7in \u00f6nerilen kabiliyetler aras\u0131nda kendine yer edinmi\u015f, bir ka\u00e7 yeni kabiliyetten bahsedece\u011fim. K\u0131sa ve \u00f6z bir yaz\u0131 olacak \ud83d\ude42<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Uzay gemisi operat\u00f6r\u00fc (&#8220;&lt;=&gt;&#8221;)<\/strong><\/span><\/h2>\n<p>\u0130lk bahsedece\u011fim kabiliyet, kimi kaynaklarda &#8220;<strong>uzay gemisi operat\u00f6r\u00fc<\/strong>&#8221; diye adland\u0131r\u0131lan &#8216;&lt;=&gt;&#8217; operat\u00f6r\u00fc. Bunun standart operat\u00f6r ismi, &#8220;<strong><em>three-way comparison operator<\/em><\/strong>&#8220;, yani \u00fc\u00e7 yollu kar\u015f\u0131la\u015ft\u0131rma operat\u00f6r\u00fc. Bu kabiliyet C++ 20 ile birlikte sunulmakta ve yaz\u0131lmas\u0131 gereken kod miktar\u0131n\u0131 ciddi bir bi\u00e7imde azaltacak bir kabiliyet. Bu kabiliyet \u015fu anda VS 2019 (16.2) taraf\u0131ndan da destekleniyor.<br \/>\nBu operat\u00f6r bize ne sa\u011flar? Temel olarak bu operat\u00f6r, derleyicinin, temel s\u0131ralama (&#8220;lexicographical&#8221;) ile ilgili kodlar\u0131 olu\u015fturmas\u0131na olanak sa\u011flar ve bu kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri i\u00e7in herhangi bir fonksiyon tan\u0131mlanmas\u0131na ihtiya\u00e7 olmuyor. Hemen bir \u00f6rnek \u00fczerinden buna bakal\u0131m (referans sayfas\u0131ndan):<\/p>\n<pre class=\"lang:c++ decode:true \">class Point {\r\n    int mX;\r\n    int mY;\r\n  public:\r\n    \/\/ Asagidaki satir ile derleyiciden kibarca bizim icin bu operatorleri tanimlamasini istiyoruz\r\n    auto operator&lt;=&gt;(const Point&amp;) const = default;\r\n\r\n    \/\/ Diger metotlar\r\n    ...\r\n};\r\n\r\n\/\/ Derleyici taraf\u0131ndan b\u00fct\u00fcn alt\u0131 ili\u015fkilendirme operat\u00f6r\u00fc \u00fcretiliyor\r\nPoint pt1, pt2;\r\n\r\n\/\/ Herhangi bir s\u0131k\u0131nt\u0131 yok\r\nif (pt1 == pt2)\r\n{\r\n    \/*...*\/\r\n}\r\n\r\n\/\/ Herhangi bir s\u0131k\u0131nt\u0131 yok\r\nstd::set&lt;Point&gt; s;\r\ns.insert(pt1);\r\n\r\n\/\/ Herhangi bir s\u0131k\u0131nt\u0131 yok\r\nif (pt1 &lt;= pt2)\r\n{\r\n    \/*...*\/\r\n}<\/pre>\n<p>Yeni operat\u00f6r ile a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekledi\u011fimiz zaman derleyici bizim i\u00e7in ==, !=, &gt;, &lt;, &gt;=, &lt;= operat\u00f6rlerine sahip. Tahmin edebilece\u011finiz \u00fczere, bu bizi olduk\u00e7a fazla kodtan, bu basit \u00f6rnek i\u00e7in bile kurtar\u0131yor. Burada kar\u015f\u0131la\u015ft\u0131rma, t\u00fcretilen baz s\u0131n\u0131flar\u0131 soldan sa\u011fa ve statik olmayan \u00fcye de\u011fi\u015fkenleride tan\u0131mlama s\u0131ras\u0131na g\u00f6re kar\u015f\u0131la\u015ft\u0131r\u0131r.<br \/>\nBu tarz karma\u015f\u0131k tiplerin kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131 i\u00e7in <span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/devblogs.microsoft.com\/cppblog\/simplify-your-code-with-rocket-science-c20s-spaceship-operator\/\"><strong>https:\/\/devblogs.microsoft.com\/cppblog\/simplify-your-code-with-rocket-science-c20s-spaceship-operator\/<\/strong><\/a> <\/span>adresinden bir \u00f6rnek ile devam edelim:<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Isme cok takilmayin o kadar da basit bir yapi olmayacak\r\nstruct Basics\r\n{\r\n    int i;\r\n    char c;\r\n    float f;\r\n    double d;\r\n    auto operator&lt;=&gt;(const Basics&amp;) const = default;\r\n};\r\n\r\nstruct Arrays \r\n{\r\n    int ai[1];\r\n    char ac[2];\r\n    float af[3];\r\n    double ad[2][2];\r\n    auto operator&lt;=&gt;(const Arrays&amp;) const = default;\r\n};\r\n\r\nstruct Bases \r\n    : Basics, Arrays \r\n{\r\n    auto operator&lt;=&gt;(const Bases&amp;) const = default;\r\n};\r\n\r\nint main() \r\n{\r\n    constexpr Bases a = { { 0, 'c', 1.f, 1. },\r\n                   { { 1 }, { 'a', 'b' }, { 1.f, 2.f, 3.f }, { { 1., 2. }, { 3., 4. } } } };\r\n    constexpr Bases b = { { 0, 'c', 1.f, 1. },\r\n                   { { 1 }, { 'a', 'b' }, { 1.f, 2.f, 3.f }, { { 1., 2. }, { 3., 4. } } } };\r\n\r\n    static_assert(a == b);\r\n    static_assert(!(a != b));\r\n    static_assert(!(a &lt; b));\r\n    static_assert(a &lt;= b);\r\n    static_assert(!(a &gt; b));\r\n    static_assert(a &gt;= b);\r\n\r\n    return 0;\r\n}<\/pre>\n<p>Burada derleyici, her bir baz s\u0131n\u0131flar\u0131n veya \u00fcye de\u011fi\u015fkenlerin kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131 aktivitelerini otomatik olarak halletmektedir.<\/p>\n<p>Burada tabi, ak\u0131llara bir soru gelebilir. \u015e\u00f6yle ki, varsay\u0131lan kar\u015f\u0131la\u015ft\u0131rma mant\u0131\u011f\u0131ndan farkl\u0131 bir kar\u015f\u0131la\u015ft\u0131rma ihtiyac\u0131 olursa ne olacak, ya da do\u011fal kar\u015f\u0131la\u015ft\u0131rma s\u0131ralamas\u0131ndan farkl\u0131 bir ihtiyac\u0131n\u0131z olursa ne olacak? O zaman da bu operat\u00f6r\u00fc siz tan\u0131mlayabilirsiniz. Burada da d\u00f6n\u00fc\u015f tipine g\u00f6re farkl\u0131 operat\u00f6rleri tan\u0131mlayabilirsiniz. Bu konua <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons<\/strong> <\/span><\/a>adresine ba\u015fvurabilirsiniz.<\/p>\n<p>Bu kabiliyeti, C++ 20 \u00f6ncesi s\u00fcr\u00fcmlerde kullan\u0131lmak i\u00e7in ya da bu deste\u011fi sunmayan derleyiciler i\u00e7in Henrik Sj\u00f6str\u00f6m&#8217;\u00fcn yaz\u0131s\u0131na (<a href=\"https:\/\/www.fluentcpp.com\/2019\/04\/09\/how-to-emulate-the-spaceship-operator-before-c20-with-crtp\/\"><span style=\"color: #008000;\"><strong>https:\/\/www.fluentcpp.com\/2019\/04\/09\/how-to-emulate-the-spaceship-operator-before-c20-with-crtp<\/strong>\/<\/span><\/a>) ba\u015fvurabilirsiniz.<\/p>\n<p>Bu kabiliyete ili\u015fkin k\u0131sm\u0131 tamamlamadan \u00f6nce bir konuya daha de\u011finmek istiyorum. O da, C++ 20 ile birlikte, dil seviyesinde kar\u015f\u0131la\u015ft\u0131rma mekanizmas\u0131 da de\u011fi\u015fmekte ve\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/brevzin.github.io\/c++\/2019\/07\/28\/comparisons-cpp20\">https:\/\/brevzin.github.io\/c++\/2019\/07\/28\/comparisons-cpp20<\/a>\/\u00a0<\/strong> <\/span>sayfas\u0131nda bu konu olduk\u00e7a detayl\u0131 ve g\u00fczel bir \u015fekilde anlat\u0131yor. Yukar\u0131da verdi\u011fim referans da, bu konuda bilgi i\u00e7ermekte ama sakin bir kafa ile bu yaz\u0131lar\u0131 okuman\u0131z\u0131 \u00f6neriyorum \ud83d\ude42 Ayruca bir yaz\u0131m\u0131 da, bu konuya ay\u0131rabilirim. Yaln\u0131z burada, verdi\u011fim kaynaktan bir ka\u00e7 hususa de\u011finmek istiyorum. \u00d6ncelikle, bu \u00fc\u00e7 y\u00f6nl\u00fc kar\u015f\u0131la\u015ft\u0131rma olay\u0131 asl\u0131nda C programlama dili k\u00fct\u00fcphaneleri arac\u0131l\u0131\u011f\u0131 ile sunulan <em>memcmp\/strcmp()<\/em> API&#8217;leri ile sa\u011flan\u0131yordu. \u015e\u00f6yleki, ilk parameter, ikinciden b\u00fcy\u00fck ise pozitif, k\u00fc\u00e7\u00fck ise negatif ve ayn\u0131 ise 0 d\u00f6n\u00fclmekteydi. Peki bu uzay gemisi operat\u00f6r\u00fcnde ne d\u00f6n\u00fcl\u00fcyor? Bu durumda \u00fc\u00e7 kategoriden birisi d\u00f6n\u00fclmekte:<\/p>\n<p><strong>strong_ordering:\u00a0<\/strong>Bu s\u0131ralama kateg\u00f6risinde e\u015fitlik, birbirleri yerine kullan\u0131labilirlik anlam\u0131na da gelmekte. Yani &#8220;(a &lt;=&gt; b) == strong_ordering::equal &#8221; demek, fonksiyonlar i\u00e7in f(a) ve f(b) sonu\u00e7lar\u0131n\u0131n ayn\u0131 olaca\u011f\u0131 anlam\u0131na gelir. Burada al\u0131nabilecek de\u011ferler <em>strong_ordering::greater, strong_ordering::equal, <\/em>ve\u00a0<em>strong_ordering::less<\/em>.<\/p>\n<p><strong>weak_ordering:<\/strong> Bu s\u0131ralama kategorisinde ise e\u015fitlik, bir denklik s\u0131n\u0131f\u0131 olu\u015fturmakta. Ne demek abi bu? Hemen bir \u00f6rnek \u00fczerinden a\u00e7\u0131klamaya \u00e7al\u0131\u015fal\u0131m. Elimizde iki adet\u00a0<em>karakter dizisi\u00a0<\/em>oldu\u011funu farz edelim, bunlar\u0131 karakter b\u00fcy\u00fckl\u00fc\u011f\u00fcnden ba\u011f\u0131ms\u0131z olarak ayn\u0131 olsa bile, bu da g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda ayn\u0131 olmad\u0131\u011f\u0131 durumlard\u0131r.\u00a0 Bu durumda al\u0131nan de\u011fer <em>weak_ordering::equivalent<\/em>\u00a0(equal de\u011fil dikkat).<\/p>\n<p><strong>partial_ordering:<\/strong>\u00a0Bu s\u0131ralama kategorisinde ise yukar\u0131da bahsetti\u011fimiz, b\u00fcy\u00fck, k\u00fc\u00e7\u00fck, e\u015fit ya da denk durumlar yan\u0131nda, s\u0131ral\u0131 olmayan <em>&#8220;unordered&#8221;<\/em> olarak nitelendirilen bir grup vard\u0131r. \u0130\u015fte bu kategori de bunlar\u0131 kapsar. \u00d6r. 1.f &lt;=&gt; NaN kar\u015f\u0131la\u015ft\u0131rmas\u0131 <em>partial_ordering::unordered<\/em> olmakta (bu arada bilmeyenler i\u00e7in NaN, &#8220;Not a Number&#8221;, yani say\u0131 de\u011fil anlam\u0131na gelmektedir).<\/p>\n<p>Yukaridaki gruplara bakt\u0131\u011f\u0131n\u0131z zaman, strong_ordering her zaman i\u00e7in \u00f6ncelikli tercih olmal\u0131d\u0131r. Bu kategorilere ili\u015fkin \u00f6rneklere de\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons\">https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons<\/a><\/strong> <\/span>sayfas\u0131ndan ula\u015fabilirsiniz.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>std::source_location<\/strong><\/span><\/h2>\n<p>C++ 20 \u00f6ncesinde C++ kodu i\u00e7erisinden, ilgili sat\u0131r say\u0131s\u0131 ve benzeri bilgilere eri\u015fmek i\u00e7in <strong>__LINE__<\/strong> ve <strong>__FILE__<\/strong> makro tan\u0131mlamalar\u0131 kullan\u0131lmaktayd\u0131. C++ 20 ile birlikte art\u0131k, source_location s\u0131n\u0131f\u0131 sunulmakta ve bunu ilk bahsetti\u011fim konu amac\u0131 ile kullan\u0131labilir. Bu kabiliyeti kullanmak i\u00e7in <strong>&lt;source_location&gt;<\/strong> ba\u015fl\u0131k dosyas\u0131 eklenmesi gerekir.<br \/>\nS\u0131n\u0131f\u0131n direk bir nesnesini olu\u015fturabilece\u011finiz gibi <em>current<\/em>() API&#8217;sini kullanarak d\u00f6n\u00fclen <em>source_location<\/em> nesnesi de bu anlamda kullan\u0131labilir. \u00d6rne\u011fin a\u015fa\u011f\u0131daki kullan\u0131ma ili\u015fkin \u00f6rnekte, log metodunun \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 nokta ile ilgili bilgiler veriliyor olacak. Bu arada bu kabiliyet de olduk\u00e7a yeni ve g\u00f6rd\u00fc\u011f\u00fcm kadar\u0131 ile bir \u00e7ok derleyici bunu sunmuyor. Sunanlar da <em>experimental<\/em>\u00a0isim uzay\u0131 alt\u0131nda sunuyor olabilirler, onun i\u00e7in buna dikkat ediniz l\u00fctfen ve derleyicinizin dok\u00fcman\u0131na ba\u015fvurabilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;source_location&gt;\r\n\r\n\/\/#include &lt;experimental\/source_location&gt;\r\n\r\nvoid log(const&amp; std::string message,\r\nconst std::source_location&amp; location = std::source_location::current())\r\n{\r\n    std::cout &lt;&lt; \"Log Info:\"\r\n        &lt;&lt; location.file_name() &lt;&lt; \":\"\r\n        &lt;&lt; location.line() &lt;&lt; \" \"\r\n        &lt;&lt; message &lt;&lt; '\\n';\r\n}\r\n\r\nint main()\r\n{\r\n    std::source_location mainInstance;\r\n    std::cout &lt;&lt; \"Log Info &lt;main&gt;:\"\r\n        &lt;&lt; mainInstance.file_name() &lt;&lt; \":\"\r\n        &lt;&lt; mainInstance.function_name() &lt;&lt; \":\"\r\n        &lt;&lt; mainInstance.line() &lt;&lt; \" \"\r\n        &lt;&lt; mainInstance.column() &lt;&lt; '\\n';\r\n\r\n    log(\"Hello world!\");\r\n    \r\n    return 0;\r\n}<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">\u015eablon (template) parametresi olarak string kullan\u0131m\u0131<\/span><\/strong><\/h2>\n<p>C++ 20 \u00f6ncesinde, C++ \u015fablonlar\u0131n\u0131n parametrelerinde karakter dizisi ya da std::string kullanam\u0131yorduk. C++ 20 ile birlikte art\u0131k bu m\u00fcmk\u00fcn olacak. Burada hedeflenen, <em>std::basic_fixed_string<\/em> ile sunulan <em>constexpr yap\u0131c\u0131s\u0131 (derleme zaman\u0131nda kullan\u0131ma olanak sa\u011flar)<\/em>\u00a0kullan\u0131larak, bu karakter dizisinin, derleme zaman\u0131nda olu\u015fturulmas\u0131na dayanmaktad\u0131r. Hemen bir \u00f6rnek ile inceleyelim:<\/p>\n<pre class=\"lang:c++ decode:true \">template&lt;std::basic_fixed_string T&gt;\r\nclass Foo \r\n{\r\n    static constexpr char const* Name = T;\r\npublic:\r\n    void hello() const;\r\n};\r\n\r\nint main() \r\n{\r\n    Foo&lt;\"Hello!\"&gt; foo;\r\n    foo.hello();\r\n}<\/pre>\n<p>Bu kabiliyete ili\u015fkin mevzuyu kapatmadan \u00f6nce, ger\u00e7ekten mevcut C++ derleyicileri ile bu kabiliyet sa\u011flanam\u0131yor mu diye bakt\u0131\u011f\u0131mda, C++ 11 ile birlikte pek de g\u00fczel olmasa da, bir \u015fekilde bu karakter dizilerinin de kullan\u0131labildi\u011fini g\u00f6rd\u00fcm. Bu konuyu merak edenler a\u015fa\u011f\u0131daki sorudaki tart\u0131\u015fmaya bir g\u00f6z atabilirler:<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/2033110\/passing-a-string-literal-as-a-parameter-to-a-c-template-class\"><span style=\"color: #008000;\"><strong>https:\/\/stackoverflow.com\/questions\/2033110\/passing-a-string-literal-as-a-parameter-to-a-c-template-class<\/strong><\/span><\/a><\/p>\n<p>Evet arkada\u015flar, bir yaz\u0131m\u0131z\u0131n daha sonuna geldim. Burada C++ 20 de gelecek (ki \u015fubat 2020 de gelebilir) baz\u0131 kabiliyetlere \u015fimdiden bir g\u00f6z att\u0131k. Tabi bunlar\u0131n yan\u0131nda \u00e7ok daha baba baz\u0131 kabiliyetler var (<em>Concepts, Ranges, Coroutines, Modules<\/em>) ama hen\u00fcz onlara ben de vak\u0131f de\u011filim \ud83d\ude42 Onlar\u0131 da inceledikten sonra sizler ile payla\u015faca\u011f\u0131m.<\/p>\n<p>O zamana kadar bol yaz\u0131l\u0131ml\u0131 g\u00fcnler.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=8jNXy3K2Wpk\"><span style=\"color: #008000;\"><strong>https:\/\/www.youtube.com\/watch?v=8jNXy3K2Wpk<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/blog.tartanllama.xyz\/spaceship-operator\/\"><span style=\"color: #008000;\"><strong>https:\/\/blog.tartanllama.xyz\/spaceship-operator\/<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.fluentcpp.com\/2019\/04\/09\/how-to-emulate-the-spaceship-operator-before-c20-with-crtp\/\"><span style=\"color: #008000;\"><strong>https:\/\/www.fluentcpp.com\/2019\/04\/09\/how-to-emulate-the-spaceship-operator-before-c20-with-crtp\/<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/simplify-your-code-with-rocket-science-c20s-spaceship-operator\/\"><span style=\"color: #008000;\"><strong>https:\/\/devblogs.microsoft.com\/cppblog\/simplify-your-code-with-rocket-science-c20s-spaceship-operator\/<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/operator_comparison#Three-way_comparison\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/operator_comparison#Three-way_comparison<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/default_comparisons <\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/brevzin.github.io\/c++\/2019\/07\/28\/comparisons-cpp20\/\"><span style=\"color: #008000;\"><strong>https:\/\/brevzin.github.io\/c++\/2019\/07\/28\/comparisons-cpp20\/<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"http:\/\/www.open-std.org\/jtc1\/SC22\/wg21\/docs\/papers\/2018\/p0732r2.pdf\">http:\/\/www.open-std.org\/jtc1\/SC22\/wg21\/docs\/papers\/2018\/p0732r2.pdf<\/a><\/strong><\/span><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/2033110\/passing-a-string-literal-as-a-parameter-to-a-c-template-class\"><span style=\"color: #008000;\"><strong>https:\/\/stackoverflow.com\/questions\/2033110\/passing-a-string-literal-as-a-parameter-to-a-c-template-class<\/strong><\/span><\/a><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>SOLID yaz\u0131lar\u0131m\u0131z\u0131 da bitirdi\u011fimize g\u00f6re art\u0131k biraz C++ a d\u00f6n\u00fc\u015f yapabiliriz. Bu yaz\u0131mda C++ 20 standard\u0131 i\u00e7in \u00f6nerilen kabiliyetler aras\u0131nda kendine yer edinmi\u015f, bir ka\u00e7 yeni kabiliyetten bahsedece\u011fim. K\u0131sa ve \u00f6z bir yaz\u0131 olacak \ud83d\ude42 Uzay gemisi operat\u00f6r\u00fc (&#8220;&lt;=&gt;&#8221;) \u0130lk bahsedece\u011fim kabiliyet, kimi kaynaklarda &#8220;uzay gemisi operat\u00f6r\u00fc&#8221; diye adland\u0131r\u0131lan &#8216;&lt;=&gt;&#8217; operat\u00f6r\u00fc. Bunun standart operat\u00f6r ismi,&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\">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":[242,640,635,639,638,642,636,634,633,637],"class_list":["post-1538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c-20","tag-default_comparisons","tag-lexicographical","tag-nan","tag-partial_ordering","tag-stdbasic_fixed_string","tag-strong_ordering","tag-three-way-comparison","tag-uzay-gemisi-operatoru","tag-weak_ordering"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 21 - Uzay gemisi operat\u00f6r\u00fc &quot;&quot;, std::source_location ve template - 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\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\" \/>\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++ 21 - Uzay gemisi operat\u00f6r\u00fc &quot;&quot;, std::source_location ve template[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"SOLID yaz\u0131lar\u0131m\u0131z\u0131 da bitirdi\u011fimize g\u00f6re art\u0131k biraz C++ a d\u00f6n\u00fc\u015f yapabiliriz. Bu yaz\u0131mda C++ 20 standard\u0131 i\u00e7in \u00f6nerilen kabiliyetler aras\u0131nda kendine yer edinmi\u015f, bir ka\u00e7 yeni kabiliyetten bahsedece\u011fim. K\u0131sa ve \u00f6z bir yaz\u0131 olacak \ud83d\ude42 Uzay gemisi operat\u00f6r\u00fc (&#8220;&lt;=&gt;&#8221;) \u0130lk bahsedece\u011fim kabiliyet, kimi kaynaklarda &#8220;uzay gemisi operat\u00f6r\u00fc&#8221; diye adland\u0131r\u0131lan &#8216;&lt;=&gt;&#8217; operat\u00f6r\u00fc. Bunun standart operat\u00f6r ismi,... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-24T20:46:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-24T20:47:33+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=\"8 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\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 21 &#8211; Uzay gemisi operat\u00f6r\u00fc &#8220;&#8220;, std::source_location ve template\",\"datePublished\":\"2019-11-24T20:46:45+00:00\",\"dateModified\":\"2019-11-24T20:47:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\"},\"wordCount\":1251,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"C++ 20\",\"default_comparisons\",\"lexicographical\",\"NaN\",\"partial_ordering\",\"std::basic_fixed_string\",\"strong_ordering\",\"three-way comparison\",\"Uzay gemisi operat\u00f6r\u00fc\",\"weak_ordering\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\",\"name\":\"[:tr]Haftal\u0131k C++ 21 - Uzay gemisi operat\u00f6r\u00fc \\\"\\\", std::source_location ve template[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-11-24T20:46:45+00:00\",\"dateModified\":\"2019-11-24T20:47:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 21 &#8211; Uzay gemisi operat\u00f6r\u00fc &#8220;&#8220;, std::source_location ve template\"}]},{\"@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++ 21 - Uzay gemisi operat\u00f6r\u00fc \"\", std::source_location ve template[:] - 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\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 21 - Uzay gemisi operat\u00f6r\u00fc \"\", std::source_location ve template[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"SOLID yaz\u0131lar\u0131m\u0131z\u0131 da bitirdi\u011fimize g\u00f6re art\u0131k biraz C++ a d\u00f6n\u00fc\u015f yapabiliriz. Bu yaz\u0131mda C++ 20 standard\u0131 i\u00e7in \u00f6nerilen kabiliyetler aras\u0131nda kendine yer edinmi\u015f, bir ka\u00e7 yeni kabiliyetten bahsedece\u011fim. K\u0131sa ve \u00f6z bir yaz\u0131 olacak \ud83d\ude42 Uzay gemisi operat\u00f6r\u00fc (&#8220;&lt;=&gt;&#8221;) \u0130lk bahsedece\u011fim kabiliyet, kimi kaynaklarda &#8220;uzay gemisi operat\u00f6r\u00fc&#8221; diye adland\u0131r\u0131lan &#8216;&lt;=&gt;&#8217; operat\u00f6r\u00fc. Bunun standart operat\u00f6r ismi,... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-11-24T20:46:45+00:00","article_modified_time":"2019-11-24T20:47:33+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":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 21 &#8211; Uzay gemisi operat\u00f6r\u00fc &#8220;&#8220;, std::source_location ve template","datePublished":"2019-11-24T20:46:45+00:00","dateModified":"2019-11-24T20:47:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/"},"wordCount":1251,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["C++ 20","default_comparisons","lexicographical","NaN","partial_ordering","std::basic_fixed_string","strong_ordering","three-way comparison","Uzay gemisi operat\u00f6r\u00fc","weak_ordering"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/","name":"[:tr]Haftal\u0131k C++ 21 - Uzay gemisi operat\u00f6r\u00fc \"\", std::source_location ve template[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-11-24T20:46:45+00:00","dateModified":"2019-11-24T20:47:33+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 21 &#8211; Uzay gemisi operat\u00f6r\u00fc &#8220;&#8220;, std::source_location ve template"}]},{"@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\/1538","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=1538"}],"version-history":[{"count":6,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1538\/revisions"}],"predecessor-version":[{"id":1544,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1538\/revisions\/1544"}],"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=1538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}