{"id":654,"date":"2018-11-21T17:27:03","date_gmt":"2018-11-21T17:27:03","guid":{"rendered":"https:\/\/yazilimperver.com\/?p=654"},"modified":"2019-01-07T19:10:06","modified_gmt":"2019-01-07T19:10:06","slug":"haftalik-c-5-stdinvoke","status":"publish","type":"post","link":"https:\/\/yazilimperver.com\/index.php\/2018\/11\/21\/haftalik-c-5-stdinvoke\/","title":{"rendered":"[:tr]Haftal\u0131k C++ 5 &#8211; std::invoke[:en]Weekly C++ 5 &#8211; std::invoke[:]"},"content":{"rendered":"<p>[:tr]Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Yine bir haftal\u0131k C++ yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131mda sizler ile birlikte C++ 17 ile birlikte sunulmaya ba\u015flanan <em>std::invoke()<\/em>\u00a0metoduna bir g\u00f6z ataca\u011f\u0131z.<\/p>\n<p><em>std::invoke()<\/em> metodu <em>&lt;functional&gt;<\/em> k\u00fct\u00fcphanesi ile sunulmakta. Bu metot sayesinde farkl\u0131 \u00e7a\u011fr\u0131labilir nesneler (serbest fonksiyon i\u015faret\u00e7ileri, s\u0131n\u0131f metodu i\u015faret\u00e7ileri, lambda metotlar\u0131, fonksiyon nesneler), tek bir mekanizma ile \u00e7a\u011fr\u0131labilecek. Bu sayede metot \u00e7a\u011fr\u0131lma mekanizmas\u0131 daha esnek ve standart bir \u015fekilde ger\u00e7ekle\u015ftirilebilecek. Peki bunlar\u0131 normalde nas\u0131l yap\u0131yorduk a\u015fa\u011f\u0131daki kod \u00f6rne\u011finde bunlar\u0131 g\u00f6rebilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;functional&gt;\r\nusing namespace std;\r\n\r\n\/\/ normal fonksiyon isaretcisi kullanimi\r\n\/\/ Ornek metodumuz\r\nint exampleSquare(int arg)\r\n{\r\n    return arg*arg;\r\n}\r\n\r\n\/\/ Fonksiyon isaretcimizi tanimlayalim\r\ntypedef  int (*SquareFuncPtr)(int);\r\n\r\n\/\/ sinif metodu isaretcisi kullanimi\r\nclass ExampleClass\r\n{ \r\npublic:\r\n    int exampleSquare(int arg)\r\n    {\r\n        return arg*arg;\r\n    }\r\n};\r\n\r\n\/\/ Fonksiyon isaretcimizi tanimlayalim\r\ntypedef  int (ExampleClass::*MemberSquareFuncPtr)(int);\r\n\r\nint main()\r\n{\r\n\t\/\/ Normal fonksiyon isaretcisi kullanimi\r\n    \/\/ C++ 17 oncesi kullanim\r\n    SquareFuncPtr plainFuncPtr = &amp;exampleSquare;\r\n    cout &lt;&lt; \"Ilgili sayinin karesi: \" &lt;&lt; plainFuncPtr(2) &lt;&lt; '\\n';\r\n\r\n    \/\/ C++ 17 sonrasi kullanim\r\n    cout &lt;&lt; \"Ilgili sayinin karesi: \" &lt;&lt; invoke(&amp;exampleSquare, 2) &lt;&lt; '\\n';\r\n\r\n    \/\/ Sinif uyesi metot  isaretcisi kullanimi\r\n    ExampleClass classInstance;\r\n\r\n    \/\/ C++ 17 oncesi kullanim\r\n    MemberSquareFuncPtr memberFuncPtr = &amp;ExampleClass::exampleSquare;\r\n    cout &lt;&lt; \"Ilgili sayinin karesi: \" &lt;&lt; (classInstance.*memberFuncPtr)(3) &lt;&lt; '\\n';\r\n    \r\n    \/\/ C++ 17 sonrasi kullanim\r\n    cout &lt;&lt; \"Ilgili sayinin karesi: \" &lt;&lt; invoke(&amp;ExampleClass::exampleSquare, classInstance, 3) &lt;&lt; '\\n';\r\n \r\n    return 0;\r\n}<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kodta da g\u00f6rebilece\u011finiz \u00fczere normal metotlar i\u00e7in geleneksel y\u00f6ntem \u00e7ok karma\u015f\u0131k olmasa da, \u00f6zellikle s\u0131n\u0131f \u00fcye metot i\u015faret\u00e7ileri i\u015fin i\u00e7ine girince karma\u015f\u0131kl\u0131k art\u0131yor. Bunlar\u0131n yan\u0131nda hem normal fonksiyon i\u015faret\u00e7ileri hem de s\u0131n\u0131f metot i\u015faret\u00e7ileri ile \u00e7al\u0131\u015fma ihtiyac\u0131n\u0131z oldu\u011fu durumda, her iki i\u015fi de kotarabilecek, basit ve anla\u015f\u0131l\u0131r bir aray\u00fcz sunuluyor.<\/p>\n<p>Sizlerin de anlayaca\u011f\u0131 \u00fczere, asl\u0131nda bu metodun sundu\u011fu yetene\u011fi bir \u015fekilde mevcut mekanizmalar ile (ilgili <strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/doc.bccnsoft.com\/docs\/cppreference2015\/en\/cpp\/utility\/functional\/invoke.html\">cpp referans sayfas\u0131nda<\/a><\/span><\/strong> \u00f6rne\u011fi var) ger\u00e7ekle\u015ftirebiliyoruz. Tabiki bu <em>std::invoke()<\/em> kadar anla\u015f\u0131labilir ve basit g\u00f6r\u00fcnm\u00fcyor \ud83d\ude42<\/p>\n<p>A\u015fa\u011f\u0131da bu metodun kullan\u0131m\u0131 ile ilgili referans kaynakta verilen \u00f6rne\u011fi g\u00f6rebilirsiniz. \u00d6rnek i\u00e7erisinde <em>std::invoke()<\/em>&#8216;un kullan\u0131labilece\u011fi olas\u0131 durumlar g\u00fczel bir \u015fekilde \u00f6zetlenmi\u015f.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;functional&gt;\r\n#include &lt;iostream&gt;\r\n \r\nstruct Foo \r\n{\r\n    Foo(int num)\r\n     : num_(num) {}\r\n\r\n    void print_add(int i) const \r\n    {\r\n         std::cout &lt;&lt; num_+i &lt;&lt; '\\n'; \r\n    }\r\n\r\n    int num_;\r\n};\r\n \r\nvoid print_num(int i)\r\n{\r\n    std::cout &lt;&lt; i &lt;&lt; '\\n';\r\n}\r\n \r\nstruct PrintNum \r\n{\r\n    void operator()(int i) const\r\n    {\r\n        std::cout &lt;&lt; i &lt;&lt; '\\n';\r\n    }\r\n};\r\n \r\nint main()\r\n{\r\n    \/\/ Serbest metot cagrilmasi\r\n    std::invoke(print_num, -9);\r\n \r\n    \/\/ Lambda cagrilmasi\r\n    std::invoke([]() { print_num(42); });\r\n \r\n    \/\/ Sinif metodu cagrilmesi\r\n    const Foo foo(314159);\r\n    std::invoke(&amp;Foo::print_add, foo, 1);\r\n \r\n    \/\/ Sinif verisine erisim\r\n    std::cout &lt;&lt; \"num_: \" &lt;&lt; std::invoke(&amp;Foo::num_, foo) &lt;&lt; '\\n';\r\n \r\n    \/\/ Fonksiyon nesnesinin cagrilmesi\r\n    std::invoke(PrintNum(), 18);\r\n}<\/pre>\n<p>Yukar\u0131daki \u00f6rne\u011fe benzer bir \u015fekilde \u00f6zellikle &#8220;<em>observer<\/em>&#8221; ya da &#8220;<em>callback<\/em>&#8221; ya da &#8220;<em>signal\/slot<\/em>&#8221; gibi mekanizmalar i\u00e7in de kullan\u0131\u015fl\u0131 olabilir.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar:<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/functional\/invoke\"><span style=\"color: #339966;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/utility\/functional\/invoke<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.murrayc.com\/permalink\/2018\/04\/15\/c17-in-libsigc-invoke-apply-and-constexpr-if\/\"><strong><span style=\"color: #339966;\">https:\/\/www.murrayc.com\/permalink\/2018\/04\/15\/c17-in-libsigc-invoke-apply-and-constexpr-if\/<\/span><\/strong><\/a><\/li>\n<\/ul>\n<p>[:en]Hello my dear yaz\u0131l\u0131mperver friends. We are together again with another weekly C++ post. In this post, we are going to explore the <em>std::invoke()<\/em> method which is provided with C++ 17.<\/p>\n<p><em>std::invoke()<\/em>\u00a0method is provided witjh <em>&lt;functional&gt;<\/em> library. Via this method all different kind of callable objects (such as free function pointers, class member function pointers, lambda functions and function objects) can be executed\/called with same syntax. Thank to this method, generic function call can be perfomed in\u00a0 a flexible and standard fashion. Before delving into details, let me summarize callable objects in C++ via sample code.<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;functional&gt;\r\nusing namespace std;\r\n\r\n\/\/ Standard function pointer usage\r\n\/\/ Example method\r\nint exampleSquare(int arg)\r\n{\r\n    return arg*arg;\r\n}\r\n\r\n\/\/ Define (let say define :) function pointer\r\ntypedef  int (*SquareFuncPtr)(int);\r\n\r\n\/\/ Class member function usage example\r\nclass ExampleClass\r\n{ \r\npublic:\r\n    int exampleSquare(int arg)\r\n    {\r\n        return arg*arg;\r\n    }\r\n};\r\n\r\n\/\/ Again define function pointer\r\ntypedef  int (ExampleClass::*MemberSquareFuncPtr)(int);\r\n\r\nint main()\r\n{\r\n    \/\/ Standard function pointer usage\r\n    \/\/ Pre C++ 17\r\n    SquareFuncPtr plainFuncPtr = &amp;exampleSquare;\r\n    cout &lt;&lt; \"Square of given number: \" &lt;&lt; plainFuncPtr(2) &lt;&lt; '\\n';\r\n\r\n    \/\/ With C++ 17\r\n    cout &lt;&lt; \"Square of given number: \" &lt;&lt; invoke(&amp;exampleSquare, 2) &lt;&lt; '\\n';\r\n\r\n    \/\/ Class member function pointer usage example\r\n    ExampleClass classInstance;\r\n\r\n    \/\/ Pre C++ 17\r\n    MemberSquareFuncPtr memberFuncPtr = &amp;ExampleClass::exampleSquare;\r\n    cout &lt;&lt; \"Square of number: \" &lt;&lt; (classInstance.*memberFuncPtr)(3) &lt;&lt; '\\n';\r\n    \r\n    \/\/ With C++ 17\r\n    cout &lt;&lt; \"Square of given number: \" &lt;&lt; invoke(&amp;ExampleClass::exampleSquare, classInstance, 3) &lt;&lt; '\\n';\r\n \r\n    return 0;\r\n}<\/pre>\n<p>As you can see in the above sample code, although regular function pointer usage is not complex, the one used for class member functions become very complex. Moreover, if you required to work with both class member and regular function pointers then this new method will provide a simple and clear usage which is also possible before but not very simple and intuitive. This means that we can already achieve std::invoke() capability by existing mechanism (as illustrated in\u00a0<strong><span style=\"color: #339966;\"><a style=\"color: #339966;\" href=\"https:\/\/doc.bccnsoft.com\/docs\/cppreference2015\/en\/cpp\/utility\/functional\/invoke.html\">cpp referans sayfas\u0131nda<\/a><\/span><\/strong>).<\/p>\n<p>Below you can find the <em>std::invoke()<\/em> sample given in reference page which summarizes nicely all possible usages of this method.<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;functional&gt;\r\n#include &lt;iostream&gt;\r\n \r\nstruct Foo \r\n{\r\n    Foo(int num)\r\n     : num_(num) {}\r\n\r\n    void print_add(int i) const \r\n    {\r\n         std::cout &lt;&lt; num_+i &lt;&lt; '\\n'; \r\n    }\r\n\r\n    int num_;\r\n};\r\n \r\nvoid print_num(int i)\r\n{\r\n    std::cout &lt;&lt; i &lt;&lt; '\\n';\r\n}\r\n \r\nstruct PrintNum \r\n{\r\n    void operator()(int i) const\r\n    {\r\n        std::cout &lt;&lt; i &lt;&lt; '\\n';\r\n    }\r\n};\r\n \r\nint main()\r\n{\r\n    \/\/ Regular method call\r\n    std::invoke(print_num, -9);\r\n \r\n    \/\/ Lambda call\r\n    std::invoke([]() { print_num(42); });\r\n \r\n    \/\/ Class member function call\r\n    const Foo foo(314159);\r\n    std::invoke(&amp;Foo::print_add, foo, 1);\r\n \r\n    \/\/ Class member data access\r\n    std::cout &lt;&lt; \"num_: \" &lt;&lt; std::invoke(&amp;Foo::num_, foo) &lt;&lt; '\\n';\r\n \r\n    \/\/ Function object call\r\n    std::invoke(PrintNum(), 18);\r\n}<\/pre>\n<p>Similar to above example, this method can also be used to implement &#8220;<em>observer<\/em>&#8220;, &#8220;<em>callback<\/em>&#8220;, &#8220;<em>signal\/slot<\/em>&#8221; or similar mechanisms.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>References:<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/functional\/invoke\"><span style=\"color: #339966;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/utility\/functional\/invoke<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.murrayc.com\/permalink\/2018\/04\/15\/c17-in-libsigc-invoke-apply-and-constexpr-if\/\"><strong><span style=\"color: #339966;\">https:\/\/www.murrayc.com\/permalink\/2018\/04\/15\/c17-in-libsigc-invoke-apply-and-constexpr-if\/<\/span><\/strong><\/a><\/li>\n<\/ul>\n<p>[:]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[:tr]Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Yine bir haftal\u0131k C++ yaz\u0131s\u0131 ile sizlerle birlikteyim. Bu yaz\u0131mda sizler ile birlikte C++ 17 ile birlikte sunulmaya ba\u015flanan std::invoke()\u00a0metoduna bir g\u00f6z ataca\u011f\u0131z. std::invoke() metodu &lt;functional&gt; k\u00fct\u00fcphanesi ile sunulmakta. Bu metot sayesinde farkl\u0131 \u00e7a\u011fr\u0131labilir nesneler (serbest fonksiyon i\u015faret\u00e7ileri, s\u0131n\u0131f metodu i\u015faret\u00e7ileri, lambda metotlar\u0131, fonksiyon nesneler), tek bir mekanizma ile \u00e7a\u011fr\u0131labilecek. Bu&#8230; <a class=\"more-link\" href=\"https:\/\/yazilimperver.com\/index.php\/2018\/11\/21\/haftalik-c-5-stdinvoke\/\">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],"tags":[13,234,256,253,254,255,42,252,203,239],"class_list":["post-654","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c","tag-c-17","tag-fonksiyon-isaretcileri","tag-functional","tag-haftalik-yazi","tag-isaretci","tag-modern-c","tag-stdinvoke","tag-weekly","tag-yapisal-baglama"],"_links":{"self":[{"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/654","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=654"}],"version-history":[{"count":0,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/654\/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=654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}