When to use UFUNCTION for delegates












0















In UnrealEngine, UFUNCTION is used for enriching functions with additional specifiers for blueprint usage, replication and delegates.



However, some delegate types don't seem to allow to bind a UFUNCTION (like a multicast delegate), while other types require to bind a UFUNCTION (like a dynamic multicast delegate).



Is there an overview available, what delegate type accepts which type of function (normal c++ or UFUNCTION)?










share|improve this question





























    0















    In UnrealEngine, UFUNCTION is used for enriching functions with additional specifiers for blueprint usage, replication and delegates.



    However, some delegate types don't seem to allow to bind a UFUNCTION (like a multicast delegate), while other types require to bind a UFUNCTION (like a dynamic multicast delegate).



    Is there an overview available, what delegate type accepts which type of function (normal c++ or UFUNCTION)?










    share|improve this question



























      0












      0








      0








      In UnrealEngine, UFUNCTION is used for enriching functions with additional specifiers for blueprint usage, replication and delegates.



      However, some delegate types don't seem to allow to bind a UFUNCTION (like a multicast delegate), while other types require to bind a UFUNCTION (like a dynamic multicast delegate).



      Is there an overview available, what delegate type accepts which type of function (normal c++ or UFUNCTION)?










      share|improve this question
















      In UnrealEngine, UFUNCTION is used for enriching functions with additional specifiers for blueprint usage, replication and delegates.



      However, some delegate types don't seem to allow to bind a UFUNCTION (like a multicast delegate), while other types require to bind a UFUNCTION (like a dynamic multicast delegate).



      Is there an overview available, what delegate type accepts which type of function (normal c++ or UFUNCTION)?







      delegates unreal-engine4






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 20:32







      Roi Danton

















      asked Nov 21 '18 at 17:01









      Roi DantonRoi Danton

      1,98121930




      1,98121930
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.



          +-----------------------------------------------+----------------------+--------------------+
          | Type | binds c++ function | binds `UFUNCTION` |
          +-----------------------------------------------+----------------------+--------------------+
          | Singlecast | yes | yes |
          | Multicast | yes | no |
          | Event | yes | ? |
          | Dynamic singlecast | no | yes |
          | Dynamic multicast | no | yes |
          | `FTimerDelegate` (singlecast) | yes | yes |
          | `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
          +-----------------------------------------------+----------------------+--------------------+


          (This is my observation so far. In case of errors, please comment or edit or add an answer.)



          Performance



          UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.



          Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.



          C++ template support for non dynamic delegates



          Delegates which accepts binding of c++ functions, can be wrapped by a template



          template<typename T>
          struct MyTemplateWrapper
          {
          DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
          };


          Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.



          Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.



          Off topic: Additional usage of UFUNCTION



          Short summary at unreal answers.






          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/3.0/"u003ecc by-sa 3.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%2f53417144%2fwhen-to-use-ufunction-for-delegates%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









            1














            Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.



            +-----------------------------------------------+----------------------+--------------------+
            | Type | binds c++ function | binds `UFUNCTION` |
            +-----------------------------------------------+----------------------+--------------------+
            | Singlecast | yes | yes |
            | Multicast | yes | no |
            | Event | yes | ? |
            | Dynamic singlecast | no | yes |
            | Dynamic multicast | no | yes |
            | `FTimerDelegate` (singlecast) | yes | yes |
            | `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
            +-----------------------------------------------+----------------------+--------------------+


            (This is my observation so far. In case of errors, please comment or edit or add an answer.)



            Performance



            UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.



            Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.



            C++ template support for non dynamic delegates



            Delegates which accepts binding of c++ functions, can be wrapped by a template



            template<typename T>
            struct MyTemplateWrapper
            {
            DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
            };


            Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.



            Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.



            Off topic: Additional usage of UFUNCTION



            Short summary at unreal answers.






            share|improve this answer




























              1














              Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.



              +-----------------------------------------------+----------------------+--------------------+
              | Type | binds c++ function | binds `UFUNCTION` |
              +-----------------------------------------------+----------------------+--------------------+
              | Singlecast | yes | yes |
              | Multicast | yes | no |
              | Event | yes | ? |
              | Dynamic singlecast | no | yes |
              | Dynamic multicast | no | yes |
              | `FTimerDelegate` (singlecast) | yes | yes |
              | `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
              +-----------------------------------------------+----------------------+--------------------+


              (This is my observation so far. In case of errors, please comment or edit or add an answer.)



              Performance



              UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.



              Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.



              C++ template support for non dynamic delegates



              Delegates which accepts binding of c++ functions, can be wrapped by a template



              template<typename T>
              struct MyTemplateWrapper
              {
              DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
              };


              Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.



              Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.



              Off topic: Additional usage of UFUNCTION



              Short summary at unreal answers.






              share|improve this answer


























                1












                1








                1







                Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.



                +-----------------------------------------------+----------------------+--------------------+
                | Type | binds c++ function | binds `UFUNCTION` |
                +-----------------------------------------------+----------------------+--------------------+
                | Singlecast | yes | yes |
                | Multicast | yes | no |
                | Event | yes | ? |
                | Dynamic singlecast | no | yes |
                | Dynamic multicast | no | yes |
                | `FTimerDelegate` (singlecast) | yes | yes |
                | `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
                +-----------------------------------------------+----------------------+--------------------+


                (This is my observation so far. In case of errors, please comment or edit or add an answer.)



                Performance



                UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.



                Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.



                C++ template support for non dynamic delegates



                Delegates which accepts binding of c++ functions, can be wrapped by a template



                template<typename T>
                struct MyTemplateWrapper
                {
                DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
                };


                Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.



                Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.



                Off topic: Additional usage of UFUNCTION



                Short summary at unreal answers.






                share|improve this answer













                Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.



                +-----------------------------------------------+----------------------+--------------------+
                | Type | binds c++ function | binds `UFUNCTION` |
                +-----------------------------------------------+----------------------+--------------------+
                | Singlecast | yes | yes |
                | Multicast | yes | no |
                | Event | yes | ? |
                | Dynamic singlecast | no | yes |
                | Dynamic multicast | no | yes |
                | `FTimerDelegate` (singlecast) | yes | yes |
                | `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
                +-----------------------------------------------+----------------------+--------------------+


                (This is my observation so far. In case of errors, please comment or edit or add an answer.)



                Performance



                UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.



                Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.



                C++ template support for non dynamic delegates



                Delegates which accepts binding of c++ functions, can be wrapped by a template



                template<typename T>
                struct MyTemplateWrapper
                {
                DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
                };


                Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.



                Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.



                Off topic: Additional usage of UFUNCTION



                Short summary at unreal answers.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 22 '18 at 23:23









                Roi DantonRoi Danton

                1,98121930




                1,98121930






























                    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%2f53417144%2fwhen-to-use-ufunction-for-delegates%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

                    "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                    Alcedinidae

                    RAC Tourist Trophy