Is it possible to insert extra operation in fold expression?











up vote
8
down vote

favorite
1












In C++17, fold expression is available, so to print arguments, we could use



template<typename ...Args>
void output_argus(Args&&... args)
{
(cout << ... << args) << EOL;
}


int main()
{
output_argus(1, "test", 5.6f);
}


having the output
1test5.6



What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?



1
test
5.6


Is that even possible? If yes, how?










share|improve this question




























    up vote
    8
    down vote

    favorite
    1












    In C++17, fold expression is available, so to print arguments, we could use



    template<typename ...Args>
    void output_argus(Args&&... args)
    {
    (cout << ... << args) << EOL;
    }


    int main()
    {
    output_argus(1, "test", 5.6f);
    }


    having the output
    1test5.6



    What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?



    1
    test
    5.6


    Is that even possible? If yes, how?










    share|improve this question


























      up vote
      8
      down vote

      favorite
      1









      up vote
      8
      down vote

      favorite
      1






      1





      In C++17, fold expression is available, so to print arguments, we could use



      template<typename ...Args>
      void output_argus(Args&&... args)
      {
      (cout << ... << args) << EOL;
      }


      int main()
      {
      output_argus(1, "test", 5.6f);
      }


      having the output
      1test5.6



      What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?



      1
      test
      5.6


      Is that even possible? If yes, how?










      share|improve this question















      In C++17, fold expression is available, so to print arguments, we could use



      template<typename ...Args>
      void output_argus(Args&&... args)
      {
      (cout << ... << args) << EOL;
      }


      int main()
      {
      output_argus(1, "test", 5.6f);
      }


      having the output
      1test5.6



      What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?



      1
      test
      5.6


      Is that even possible? If yes, how?







      c++ templates c++17 variadic-templates fold-expression






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 8 at 22:35









      max66

      32.4k63660




      32.4k63660










      asked Nov 8 at 22:16









      r0ng

      625723




      625723
























          3 Answers
          3






          active

          oldest

          votes

















          up vote
          12
          down vote



          accepted











          What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?




          You can use the power of the comma operator



           ((std::cout << args << std::endl), ...);


          or, as suggested by Quentin (thanks) and as you asked, you can simply use n instead of std::endl (to avoid multiple flushing of the stream)



           ((std::cout << args << 'n'), ...); 





          share|improve this answer



















          • 3




            std::endl is completely overkill, OP just wants a newline.
            – Quentin
            Nov 8 at 22:31










          • @Quentin - good point; added to the answer.
            – max66
            Nov 8 at 22:34


















          up vote
          2
          down vote













          This is @n.m.'s solution without the rude global greedy operator<<.



          template<class Os>
          struct chain_stream {
          Os& stream;
          template<class Rhs,
          std::enable_if_t<std::is_same_v<Os&, decltype(std::declval<Os&>() << std::declval<Rhs>())>, bool> =true
          >
          friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
          os.stream << std::forward<Rhs>(rhs);
          return os;
          }
          // iomanipulator:
          friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Os&(*rhs)(Os&) ) {
          os.stream << rhs;
          return os;
          }
          template<class Rhs,
          std::enable_if_t<
          std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, void >
          || std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, Os& >,
          bool> =true
          >
          friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
          std::forward<Rhs>(rhs)( os );
          return os;
          }
          };


          now we can do:



           (chain_stream{std::cout} << ... << [&](auto& x){x << args << 'n';});


          and it works.






          share|improve this answer




























            up vote
            1
            down vote













            I know that the comma operator is probably the easiest way to do that, but for completeness here's something I came up with, mainly because I wanted to show off my little generalisation of iomanip. The standard library iomanips are functions. There's an << overload that takes a function pointer. I extended that for arbitrary callable objects that take and return streams by reference.



            template <class Stream, class Func>
            auto operator << (Stream& s, Func f) ->
            std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
            {
            return f(s);
            }


            With this little tool in our toolbox, it's easy to write a fold expression that does absolutely anything we want.



            template<typename ...Args>
            void output_args(Args&&... args)
            {
            (std::cout << ... << [&](auto& x)->auto&{return x << args << 'n';});
            }


            This technique can be used in scenarios where we need to capture the value of the fold expression, rather than its side effects. The comma operator is less useful in such contexts.






            share|improve this answer





















            • A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
              – Yakk - Adam Nevraumont
              Nov 9 at 0:54










            • See my solution based off yours.
              – Yakk - Adam Nevraumont
              Nov 9 at 1:07










            • @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
              – n.m.
              Nov 9 at 5:43












            • yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
              – Yakk - Adam Nevraumont
              Nov 9 at 12:20










            • @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
              – n.m.
              Nov 9 at 13:10











            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',
            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%2f53216992%2fis-it-possible-to-insert-extra-operation-in-fold-expression%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            3 Answers
            3






            active

            oldest

            votes








            3 Answers
            3






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            12
            down vote



            accepted











            What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?




            You can use the power of the comma operator



             ((std::cout << args << std::endl), ...);


            or, as suggested by Quentin (thanks) and as you asked, you can simply use n instead of std::endl (to avoid multiple flushing of the stream)



             ((std::cout << args << 'n'), ...); 





            share|improve this answer



















            • 3




              std::endl is completely overkill, OP just wants a newline.
              – Quentin
              Nov 8 at 22:31










            • @Quentin - good point; added to the answer.
              – max66
              Nov 8 at 22:34















            up vote
            12
            down vote



            accepted











            What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?




            You can use the power of the comma operator



             ((std::cout << args << std::endl), ...);


            or, as suggested by Quentin (thanks) and as you asked, you can simply use n instead of std::endl (to avoid multiple flushing of the stream)



             ((std::cout << args << 'n'), ...); 





            share|improve this answer



















            • 3




              std::endl is completely overkill, OP just wants a newline.
              – Quentin
              Nov 8 at 22:31










            • @Quentin - good point; added to the answer.
              – max66
              Nov 8 at 22:34













            up vote
            12
            down vote



            accepted







            up vote
            12
            down vote



            accepted







            What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?




            You can use the power of the comma operator



             ((std::cout << args << std::endl), ...);


            or, as suggested by Quentin (thanks) and as you asked, you can simply use n instead of std::endl (to avoid multiple flushing of the stream)



             ((std::cout << args << 'n'), ...); 





            share|improve this answer















            What if I would like using the fold expression appending an extra character 'n' to each element to get the following results?




            You can use the power of the comma operator



             ((std::cout << args << std::endl), ...);


            or, as suggested by Quentin (thanks) and as you asked, you can simply use n instead of std::endl (to avoid multiple flushing of the stream)



             ((std::cout << args << 'n'), ...); 






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 8 at 22:34

























            answered Nov 8 at 22:28









            max66

            32.4k63660




            32.4k63660








            • 3




              std::endl is completely overkill, OP just wants a newline.
              – Quentin
              Nov 8 at 22:31










            • @Quentin - good point; added to the answer.
              – max66
              Nov 8 at 22:34














            • 3




              std::endl is completely overkill, OP just wants a newline.
              – Quentin
              Nov 8 at 22:31










            • @Quentin - good point; added to the answer.
              – max66
              Nov 8 at 22:34








            3




            3




            std::endl is completely overkill, OP just wants a newline.
            – Quentin
            Nov 8 at 22:31




            std::endl is completely overkill, OP just wants a newline.
            – Quentin
            Nov 8 at 22:31












            @Quentin - good point; added to the answer.
            – max66
            Nov 8 at 22:34




            @Quentin - good point; added to the answer.
            – max66
            Nov 8 at 22:34












            up vote
            2
            down vote













            This is @n.m.'s solution without the rude global greedy operator<<.



            template<class Os>
            struct chain_stream {
            Os& stream;
            template<class Rhs,
            std::enable_if_t<std::is_same_v<Os&, decltype(std::declval<Os&>() << std::declval<Rhs>())>, bool> =true
            >
            friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
            os.stream << std::forward<Rhs>(rhs);
            return os;
            }
            // iomanipulator:
            friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Os&(*rhs)(Os&) ) {
            os.stream << rhs;
            return os;
            }
            template<class Rhs,
            std::enable_if_t<
            std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, void >
            || std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, Os& >,
            bool> =true
            >
            friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
            std::forward<Rhs>(rhs)( os );
            return os;
            }
            };


            now we can do:



             (chain_stream{std::cout} << ... << [&](auto& x){x << args << 'n';});


            and it works.






            share|improve this answer

























              up vote
              2
              down vote













              This is @n.m.'s solution without the rude global greedy operator<<.



              template<class Os>
              struct chain_stream {
              Os& stream;
              template<class Rhs,
              std::enable_if_t<std::is_same_v<Os&, decltype(std::declval<Os&>() << std::declval<Rhs>())>, bool> =true
              >
              friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
              os.stream << std::forward<Rhs>(rhs);
              return os;
              }
              // iomanipulator:
              friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Os&(*rhs)(Os&) ) {
              os.stream << rhs;
              return os;
              }
              template<class Rhs,
              std::enable_if_t<
              std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, void >
              || std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, Os& >,
              bool> =true
              >
              friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
              std::forward<Rhs>(rhs)( os );
              return os;
              }
              };


              now we can do:



               (chain_stream{std::cout} << ... << [&](auto& x){x << args << 'n';});


              and it works.






              share|improve this answer























                up vote
                2
                down vote










                up vote
                2
                down vote









                This is @n.m.'s solution without the rude global greedy operator<<.



                template<class Os>
                struct chain_stream {
                Os& stream;
                template<class Rhs,
                std::enable_if_t<std::is_same_v<Os&, decltype(std::declval<Os&>() << std::declval<Rhs>())>, bool> =true
                >
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
                os.stream << std::forward<Rhs>(rhs);
                return os;
                }
                // iomanipulator:
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Os&(*rhs)(Os&) ) {
                os.stream << rhs;
                return os;
                }
                template<class Rhs,
                std::enable_if_t<
                std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, void >
                || std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, Os& >,
                bool> =true
                >
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
                std::forward<Rhs>(rhs)( os );
                return os;
                }
                };


                now we can do:



                 (chain_stream{std::cout} << ... << [&](auto& x){x << args << 'n';});


                and it works.






                share|improve this answer












                This is @n.m.'s solution without the rude global greedy operator<<.



                template<class Os>
                struct chain_stream {
                Os& stream;
                template<class Rhs,
                std::enable_if_t<std::is_same_v<Os&, decltype(std::declval<Os&>() << std::declval<Rhs>())>, bool> =true
                >
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
                os.stream << std::forward<Rhs>(rhs);
                return os;
                }
                // iomanipulator:
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Os&(*rhs)(Os&) ) {
                os.stream << rhs;
                return os;
                }
                template<class Rhs,
                std::enable_if_t<
                std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, void >
                || std::is_same_v< std::result_of_t< Rhs&&(chain_stream const&) >, Os& >,
                bool> =true
                >
                friend chain_stream<Os> const& operator<<( chain_stream<Os> const& os, Rhs&& rhs ) {
                std::forward<Rhs>(rhs)( os );
                return os;
                }
                };


                now we can do:



                 (chain_stream{std::cout} << ... << [&](auto& x){x << args << 'n';});


                and it works.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 9 at 1:07









                Yakk - Adam Nevraumont

                178k19185364




                178k19185364






















                    up vote
                    1
                    down vote













                    I know that the comma operator is probably the easiest way to do that, but for completeness here's something I came up with, mainly because I wanted to show off my little generalisation of iomanip. The standard library iomanips are functions. There's an << overload that takes a function pointer. I extended that for arbitrary callable objects that take and return streams by reference.



                    template <class Stream, class Func>
                    auto operator << (Stream& s, Func f) ->
                    std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
                    {
                    return f(s);
                    }


                    With this little tool in our toolbox, it's easy to write a fold expression that does absolutely anything we want.



                    template<typename ...Args>
                    void output_args(Args&&... args)
                    {
                    (std::cout << ... << [&](auto& x)->auto&{return x << args << 'n';});
                    }


                    This technique can be used in scenarios where we need to capture the value of the fold expression, rather than its side effects. The comma operator is less useful in such contexts.






                    share|improve this answer





















                    • A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                      – Yakk - Adam Nevraumont
                      Nov 9 at 0:54










                    • See my solution based off yours.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 1:07










                    • @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                      – n.m.
                      Nov 9 at 5:43












                    • yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 12:20










                    • @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                      – n.m.
                      Nov 9 at 13:10















                    up vote
                    1
                    down vote













                    I know that the comma operator is probably the easiest way to do that, but for completeness here's something I came up with, mainly because I wanted to show off my little generalisation of iomanip. The standard library iomanips are functions. There's an << overload that takes a function pointer. I extended that for arbitrary callable objects that take and return streams by reference.



                    template <class Stream, class Func>
                    auto operator << (Stream& s, Func f) ->
                    std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
                    {
                    return f(s);
                    }


                    With this little tool in our toolbox, it's easy to write a fold expression that does absolutely anything we want.



                    template<typename ...Args>
                    void output_args(Args&&... args)
                    {
                    (std::cout << ... << [&](auto& x)->auto&{return x << args << 'n';});
                    }


                    This technique can be used in scenarios where we need to capture the value of the fold expression, rather than its side effects. The comma operator is less useful in such contexts.






                    share|improve this answer





















                    • A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                      – Yakk - Adam Nevraumont
                      Nov 9 at 0:54










                    • See my solution based off yours.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 1:07










                    • @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                      – n.m.
                      Nov 9 at 5:43












                    • yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 12:20










                    • @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                      – n.m.
                      Nov 9 at 13:10













                    up vote
                    1
                    down vote










                    up vote
                    1
                    down vote









                    I know that the comma operator is probably the easiest way to do that, but for completeness here's something I came up with, mainly because I wanted to show off my little generalisation of iomanip. The standard library iomanips are functions. There's an << overload that takes a function pointer. I extended that for arbitrary callable objects that take and return streams by reference.



                    template <class Stream, class Func>
                    auto operator << (Stream& s, Func f) ->
                    std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
                    {
                    return f(s);
                    }


                    With this little tool in our toolbox, it's easy to write a fold expression that does absolutely anything we want.



                    template<typename ...Args>
                    void output_args(Args&&... args)
                    {
                    (std::cout << ... << [&](auto& x)->auto&{return x << args << 'n';});
                    }


                    This technique can be used in scenarios where we need to capture the value of the fold expression, rather than its side effects. The comma operator is less useful in such contexts.






                    share|improve this answer












                    I know that the comma operator is probably the easiest way to do that, but for completeness here's something I came up with, mainly because I wanted to show off my little generalisation of iomanip. The standard library iomanips are functions. There's an << overload that takes a function pointer. I extended that for arbitrary callable objects that take and return streams by reference.



                    template <class Stream, class Func>
                    auto operator << (Stream& s, Func f) ->
                    std::enable_if_t<std::is_same_v<decltype(f(s)), Stream&>, Stream&>
                    {
                    return f(s);
                    }


                    With this little tool in our toolbox, it's easy to write a fold expression that does absolutely anything we want.



                    template<typename ...Args>
                    void output_args(Args&&... args)
                    {
                    (std::cout << ... << [&](auto& x)->auto&{return x << args << 'n';});
                    }


                    This technique can be used in scenarios where we need to capture the value of the fold expression, rather than its side effects. The comma operator is less useful in such contexts.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 8 at 23:09









                    n.m.

                    69.8k882165




                    69.8k882165












                    • A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                      – Yakk - Adam Nevraumont
                      Nov 9 at 0:54










                    • See my solution based off yours.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 1:07










                    • @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                      – n.m.
                      Nov 9 at 5:43












                    • yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 12:20










                    • @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                      – n.m.
                      Nov 9 at 13:10


















                    • A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                      – Yakk - Adam Nevraumont
                      Nov 9 at 0:54










                    • See my solution based off yours.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 1:07










                    • @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                      – n.m.
                      Nov 9 at 5:43












                    • yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                      – Yakk - Adam Nevraumont
                      Nov 9 at 12:20










                    • @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                      – n.m.
                      Nov 9 at 13:10
















                    A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                    – Yakk - Adam Nevraumont
                    Nov 9 at 0:54




                    A free greedy << operator seems rude. Instead, I'd tag one of the types (the function or the stream).
                    – Yakk - Adam Nevraumont
                    Nov 9 at 0:54












                    See my solution based off yours.
                    – Yakk - Adam Nevraumont
                    Nov 9 at 1:07




                    See my solution based off yours.
                    – Yakk - Adam Nevraumont
                    Nov 9 at 1:07












                    @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                    – n.m.
                    Nov 9 at 5:43






                    @Yakk-AdamNevraumont the idea is to have function objects working exactly like plain old functions. Plain old functions are already working as io manipulators.
                    – n.m.
                    Nov 9 at 5:43














                    yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                    – Yakk - Adam Nevraumont
                    Nov 9 at 12:20




                    yes, but the << overload for them has specific types. Yours will work on things itterly unrelates to ostreams. Possibly by accident, in the worst case cause build breaks due to non-sfinae errors.
                    – Yakk - Adam Nevraumont
                    Nov 9 at 12:20












                    @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                    – n.m.
                    Nov 9 at 13:10




                    @Yakk-AdamNevraumont Yes, it is easy to restrict this to ostreams, didn't do this here to reduce verbosity.
                    – n.m.
                    Nov 9 at 13:10


















                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53216992%2fis-it-possible-to-insert-extra-operation-in-fold-expression%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

                    Guess what letter conforming each word

                    Port of Spain

                    Run scheduled task as local user group (not BUILTIN)