Date: Sun, 8 Mar 2020 17:55:42 -0400
Well I believe a proposal should be open for debate, just like a thesis.
We both agree these overloads should be simplified but we disagree on
the syntax.
I saw the recursive lambda thing and I think I already talked to you
before regarding CV overloads but we were proposing the following syntax:
struct A
{
template <bool BC>
void foo() bool<BC>
{
}
};
And regarding the this generic overloading I still believe the following
syntax is cleaner:
struct A
{
template <typename T>
bool compare(T const &);
};
template <typename C, typename T>
void C::compare(C const &)
{
...
}
Because with your syntax I could technically reassign "self":
struct A
{
template <typename C, typename T>
bool compare(this C & c, T const &);
};
template <typename C, typename T>
bool C::compare(this C & c, T const &) // redundant C here
{
static C sc = C();
c = sc; // in theory we could do this unless you patch the
compilers with a new error for that specific case
}
We both agree these overloads should be simplified but we disagree on
the syntax.
I saw the recursive lambda thing and I think I already talked to you
before regarding CV overloads but we were proposing the following syntax:
struct A
{
template <bool BC>
void foo() bool<BC>
{
}
};
And regarding the this generic overloading I still believe the following
syntax is cleaner:
struct A
{
template <typename T>
bool compare(T const &);
};
template <typename C, typename T>
void C::compare(C const &)
{
...
}
Because with your syntax I could technically reassign "self":
struct A
{
template <typename C, typename T>
bool compare(this C & c, T const &);
};
template <typename C, typename T>
bool C::compare(this C & c, T const &) // redundant C here
{
static C sc = C();
c = sc; // in theory we could do this unless you patch the
compilers with a new error for that specific case
}
-- *Phil Bouchard* Founder C.: (819) 328-4743 Fornux Logo <http://www.fornux.com> On 3/8/20 5:37 AM, Gašper Ažman wrote: > I meant that you should consider the incremental value of your > proposal over p0847, which is on track for c++23 unless serious issues > crop up > > On Sat, Mar 7, 2020, 19:04 Phil Bouchard <phil_at_[hidden] > <mailto:phil_at_[hidden]>> wrote: > > The syntaxes are way different: > > http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0847r4.html > > In your case the compiler will have to change all of its rules for > the number of parameters "operator" overloads. For example: > > struct A > > { > > int value; > > ... > > template <typename Self> > > bool operator < (this Self && self, A const & a) // 2 > parameters... ok > > { > > return self.value < a.value; > > } > > > bool operator < (A const & a) // 1 parameter... ok > > { > > return value < a.value; > > } > > }; > > > -- > > *Phil Bouchard* > Founder > C.: (819) 328-4743 > > Fornux Logo <http://www.fornux.com> > > > On 3/7/20 1:35 PM, Gašper Ažman wrote: >> P0847 >> >> On Sat, Mar 7, 2020, 18:33 Phil Bouchard via Std-Proposals >> <std-proposals_at_[hidden] >> <mailto:std-proposals_at_[hidden]>> wrote: >> >> Alright, I'm pretty sure this is not implemented yet. Suppose >> you have: >> >> struct A >> >> { >> >> int value; >> >> ... >> >> template <typename T> >> >> int compare(T const & t) const; >> >> } >> >> >> struct B >> >> { >> >> int value; >> >> ... >> >> template <typename T> >> >> int compare(T const & t) const; >> >> } >> >> >> Then a generic way to define the same functionality for all >> classes would be to have a "template 'this'": >> >> template <typename C, typename T> >> >> inline int C::compare(T const & t) const >> >> { >> >> return value == t.value ? 0 : value < t.value ? >> -1 : 1; >> >> } >> >> >> (Please include my email address in your replies) >> >> >> -- >> >> *Phil Bouchard* >> Founder >> C.: (819) 328-4743 >> >> Fornux Logo <http://www.fornux.com> >> -- >> Std-Proposals mailing list >> Std-Proposals_at_[hidden] >> <mailto:Std-Proposals_at_[hidden]> >> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals >>
Received on 2020-03-08 16:58:30