Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #119556

Re: How to implement Foo:swap

From Andrey Tarasevich <andreytarasevich@hotmail.com>
Newsgroups comp.lang.c++
Subject Re: How to implement Foo:swap
Date 2024-06-28 09:33 -0700
Organization A noiseless patient Spider
Message-ID <v5mol0$3dlqi$1@dont-email.me> (permalink)
References <007640d1cb118697d04d54163e74b744fbea7cfb.camel@gmail.com> <v5lh80$36bet$1@dont-email.me> <v5lrh3$38ogd$1@raubtier-asyl.eternal-september.org>

Show all headers | View raw


On 06/28/24 1:16 AM, Bonita Montero wrote:
> Am 28.06.2024 um 07:21 schrieb Andrey Tarasevich:
>> On 06/27/24 10:42 AM, wij wrote:
>>> template<typename T>
>>> struct Foo {
>>>   int m_val;
>>>
>>>   void swap(Foo& ano) {
>>>     Foo tmp(ano);
>>>     ano.m_val=m_val;
>>>     m_val=tmp.m_val;
>>>   };
>>> }
>>>
>>> How to implement Foo:swap(..) if m_val is enum type or function 
>>> pointer type?
>>> (not using std::swap)
>>
>> Firstly, when implementing a custom `swap` for your custom type it is 
>> a better idea to implement it as a friend function
> 
> m_val is public anyway, so there's no need for a friend.
> 
>>
>>    template<typename T> struct Foo
>>    {
>>      int m_val;
>>
>>      friend void swap(Foo &lhs, Foo &rhs) noexcept
>>      {
>>        int t = lhs.m_val;
>>        lhs.m_val = rhs.m_val;
>>        rhs.m_val = t;
>>      }
>>    };
>>
>> A friend-based implementation will allow one to use your type with the 
>> `using std::swap` idiom.

Yes, there kinda-sorta is a "need for a friend", if you take into 
account the fact that the OP is actually defining a class _template_ 
`Foo<T>. There's no visible reason why `Foo` is a template in the OP's 
code snippet, but if they want a template - so be it.

What I did in my code is I provided a non-template (!) friend function 
`swap`, which will be automatically generated for every specialization 
of class template `Foo<>`. The key point here is that my `swap` itself 
is not a template. It is a so-called "templated entity" ("templatED" - a 
concept introduced by C++11), but it is not a template itself.

C++ does not provide syntax for an out-of-class-template definition of 
such a non-template function. The only way to define it is to define it 
inline, directly _inside_ class-template definition as a `friend`. So, 
the only reason I used `friend` here is to plant the definition of 
non-member function `swap` _into_ the definition of class template `Foo<T>`.

It's a trick.

This is one of the idiomatic side-uses of `friend` specifier, which is 
not related to access control at all.

-- 
Best regards,
Andrey

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

How to implement Foo:swap wij <wyniijj5@gmail.com> - 2024-06-28 01:42 +0800
  Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-27 19:53 +0200
    Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-27 19:57 +0200
  Re: How to implement Foo:swap red floyd <no.spam.here@its.invalid> - 2024-06-27 14:02 -0700
    Re: How to implement Foo:swap wij <wyniijj5@gmail.com> - 2024-06-28 08:51 +0800
      Re: How to implement Foo:swap red floyd <no.spam.here@its.invalid> - 2024-06-27 21:46 -0700
      Re: How to implement Foo:swap red floyd <no.spam.here@its.invalid> - 2024-06-27 21:53 -0700
      Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-28 11:04 -0700
  Re: How to implement Foo:swap Paavo Helde <eesnimi@osa.pri.ee> - 2024-06-28 00:04 +0300
  Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-27 22:21 -0700
    Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-28 10:16 +0200
      Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-28 09:33 -0700
        Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-28 23:51 +0200
          Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-28 15:23 -0700
            Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 12:12 +0200
              Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 15:03 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 08:59 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 19:04 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 10:27 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 19:52 +0200
                Re: How to implement Foo:swap "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-06-29 12:33 -0700
                Re: How to implement Foo:swap "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-06-29 12:34 -0700
                Re: How to implement Foo:swap Richard Damon <richard@damon-family.org> - 2024-06-29 16:13 -0400
                Re: How to implement Foo:swap "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-06-29 13:52 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-30 00:38 +0200
                Re: How to implement Foo:swap "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2024-06-29 18:09 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 19:22 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 10:43 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 19:49 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 11:03 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 20:08 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 11:24 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 20:46 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 20:48 -0700
              Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 08:55 -0700
                Re: How to implement Foo:swap Bonita Montero <Bonita.Montero@gmail.com> - 2024-06-29 19:05 +0200
                Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 10:35 -0700
              Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-06-29 09:15 -0700
    Re: How to implement Foo:swap Marcel Mueller <news.5.maazl@spamgourmet.org> - 2024-07-15 20:33 +0200
      Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-07-15 20:04 -0700
        Re: How to implement Foo:swap Marcel Mueller <news.5.maazl@spamgourmet.org> - 2024-07-20 13:19 +0200
          Re: How to implement Foo:swap Andrey Tarasevich <andreytarasevich@hotmail.com> - 2024-07-20 20:18 -0700

csiph-web