Lambda functions with template parameters, not in function parametersWhat is a lambda (function)?How do I test a private function or a class that has private methods, fields or inner classes?Why can templates only be implemented in the header file?Where and why do I have to put the “template” and “typename” keywords?Distinct() with lambda?Can lambda functions be templated?What is a lambda expression in C++11?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviations

What happens to a net with the Returning Weapon artificer infusion after it hits?

How much horsepower to weight is required for a 1:1 thrust ratio

What is Weapon Handling?

Why Italian monolingual dictionaries usually take complex/archaic examples from books instead of creating simple examples?

Another student has been assigned the same MSc thesis as mine (and already defended)

Top off gas with old oil, is that bad?

Convert a string of digits from words to an integer

Lost passport which have valid student visa but I make new passport unable paste

Whaling ship logistics

"I will not" or "I don't" as an answer for negative orders?

Why isn't there armor to protect from spells in the Potterverse?

Do interval ratios take overtones into account or solely the fundamental frequency?

Received a package but didn't order it

Problematic Nature of Views

Why aren't faces sharp in my f/1.8 portraits even though I'm carefully using center-point autofocus?

Does variance make sense in a fully immutable language?

Delete n lines skip 1 line script

Why does Captain Marvel in the MCU not have her sash?

Would an object shot from earth fall into the sun?

Can I exile my opponent's Progenitus/True-Name Nemesis with Teferi, Hero of Dominaria's emblem?

How To: Refresh environment A(QA) from environment B(Prod) after they're out of sync

An impressive body of work

Fix Ethernet 10/100 PoE cable with 7 out of 8 wires alive

London Congestion Charge on A205



Lambda functions with template parameters, not in function parameters


What is a lambda (function)?How do I test a private function or a class that has private methods, fields or inner classes?Why can templates only be implemented in the header file?Where and why do I have to put the “template” and “typename” keywords?Distinct() with lambda?Can lambda functions be templated?What is a lambda expression in C++11?Replacing a 32-bit loop counter with 64-bit introduces crazy performance deviations






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6















Why does the first call not compile?



auto get1 = []<int B>() return B; ;
auto get2 = []<typename B>(B b) return b; ;

int main()

get1<5>(); // error: no match for operator<
get2(5); // ok



The reason I use this, is an expression repeated many times in code.



Of course I can use a real function function, but just I am curious WHY.










share|improve this question
































    6















    Why does the first call not compile?



    auto get1 = []<int B>() return B; ;
    auto get2 = []<typename B>(B b) return b; ;

    int main()

    get1<5>(); // error: no match for operator<
    get2(5); // ok



    The reason I use this, is an expression repeated many times in code.



    Of course I can use a real function function, but just I am curious WHY.










    share|improve this question




























      6












      6








      6


      2






      Why does the first call not compile?



      auto get1 = []<int B>() return B; ;
      auto get2 = []<typename B>(B b) return b; ;

      int main()

      get1<5>(); // error: no match for operator<
      get2(5); // ok



      The reason I use this, is an expression repeated many times in code.



      Of course I can use a real function function, but just I am curious WHY.










      share|improve this question
















      Why does the first call not compile?



      auto get1 = []<int B>() return B; ;
      auto get2 = []<typename B>(B b) return b; ;

      int main()

      get1<5>(); // error: no match for operator<
      get2(5); // ok



      The reason I use this, is an expression repeated many times in code.



      Of course I can use a real function function, but just I am curious WHY.







      c++ templates lambda c++20






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 9 hours ago









      Barry

      200k22 gold badges375 silver badges669 bronze badges




      200k22 gold badges375 silver badges669 bronze badges










      asked 9 hours ago









      ChameleonChameleon

      6191 gold badge5 silver badges13 bronze badges




      6191 gold badge5 silver badges13 bronze badges

























          1 Answer
          1






          active

          oldest

          votes


















          10
















          This is easier to understand if you consider what the equivalent class type looks like to your get1:



          struct get1_t 
          template <int B> operator()() const return B;
          ;

          get1_t get1;

          get1<5>(); // error


          You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



          get1.operator()<5>(); // ok


          Or restructure the call operator to take something deducible:



          template <int B> struct constant ;
          get1(constant<5>);



          Or restructure the whole thing to actually be the variable template that it looks like it is:



          template <int B>
          auto get1 = [] return B; ;


          Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






          share|improve this answer





























            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );














            draft saved

            draft discarded
















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f58064451%2flambda-functions-with-template-parameters-not-in-function-parameters%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            10
















            This is easier to understand if you consider what the equivalent class type looks like to your get1:



            struct get1_t 
            template <int B> operator()() const return B;
            ;

            get1_t get1;

            get1<5>(); // error


            You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



            get1.operator()<5>(); // ok


            Or restructure the call operator to take something deducible:



            template <int B> struct constant ;
            get1(constant<5>);



            Or restructure the whole thing to actually be the variable template that it looks like it is:



            template <int B>
            auto get1 = [] return B; ;


            Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






            share|improve this answer































              10
















              This is easier to understand if you consider what the equivalent class type looks like to your get1:



              struct get1_t 
              template <int B> operator()() const return B;
              ;

              get1_t get1;

              get1<5>(); // error


              You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



              get1.operator()<5>(); // ok


              Or restructure the call operator to take something deducible:



              template <int B> struct constant ;
              get1(constant<5>);



              Or restructure the whole thing to actually be the variable template that it looks like it is:



              template <int B>
              auto get1 = [] return B; ;


              Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






              share|improve this answer





























                10














                10










                10









                This is easier to understand if you consider what the equivalent class type looks like to your get1:



                struct get1_t 
                template <int B> operator()() const return B;
                ;

                get1_t get1;

                get1<5>(); // error


                You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



                get1.operator()<5>(); // ok


                Or restructure the call operator to take something deducible:



                template <int B> struct constant ;
                get1(constant<5>);



                Or restructure the whole thing to actually be the variable template that it looks like it is:



                template <int B>
                auto get1 = [] return B; ;


                Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.






                share|improve this answer















                This is easier to understand if you consider what the equivalent class type looks like to your get1:



                struct get1_t 
                template <int B> operator()() const return B;
                ;

                get1_t get1;

                get1<5>(); // error


                You're trying to provide an explicit template parameter to the call operator, but syntactically you're doing what looks like providing template parameters for get1 itself (i.e. as if get1 were a variable template). In order to provide the template parameter for the call operator, you have to do that directly:



                get1.operator()<5>(); // ok


                Or restructure the call operator to take something deducible:



                template <int B> struct constant ;
                get1(constant<5>);



                Or restructure the whole thing to actually be the variable template that it looks like it is:



                template <int B>
                auto get1 = [] return B; ;


                Now, get1<5> is itself a lambda, that you're invoking. That is, rather than a lambda with a call operator template we have a variable template lambda that is itself not a template.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 8 hours ago









                T.C.

                111k14 gold badges229 silver badges338 bronze badges




                111k14 gold badges229 silver badges338 bronze badges










                answered 9 hours ago









                BarryBarry

                200k22 gold badges375 silver badges669 bronze badges




                200k22 gold badges375 silver badges669 bronze badges

































                    draft saved

                    draft discarded















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f58064451%2flambda-functions-with-template-parameters-not-in-function-parameters%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                    Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                    François Viète Contents Biography Work and thought Bibliography See also Notes Further reading External links Navigation menup. 21Google Bookspp. 75–77Google BooksDe thou (from University of Saint Andrews)ArchivedGoogle BooksGoogle BooksGoogle BooksGoogle booksGoogle Bookscc-parthenay.frL'histoire universelle (fr)Universal History (en)ArchivedAdsabs.harvard.eduPagesperso-orange.frArchive.orgChikara Sasaki. Descartes' mathematical thought p.259Google BooksGoogle BooksGoogle Bookspp. 152 and onwardGoogle BooksGoogle BooksScribd.comGoogle Books1257-7979Google BooksGoogle BooksGoogle BooksGoogle BooksGoogle BooksGoogle BooksGallica.bnf.frGoogle BooksGoogle Books"François Viète"Francois Viète: Father of Modern Algebraic NotationThe Lawyer and the GamblerAbout TarporleySite de Jean-Paul GuichardL'algèbre nouvelle"About the Harmonicon"cb120511976(data)1188044800000 0001 0913 5903n82164680ola2013766880073431702w6vt1sb70287374827140948071409480