Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #119556
| 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> |
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
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