No implicit opOpAssign for structs with basic types?
Ali Çehreli
acehreli at yahoo.com
Sat Apr 4 15:58:23 UTC 2020
On 4/4/20 8:45 AM, Steven Schveighoffer wrote:
>> Yes, sure, but in C++ I don't have to explicitly write this down. It
>> just works. IMO that makes a lot of sense as long as all types fit.
>> This just looks superfluously.
>>
>
> steves at homebuild:~$ cat test.cpp
> struct S
> {
> float a;
> float b;
> };
> int main()
> {
> S a = {1, 5};
> S b = {2, 5};
>
> a += b;
> }
> steves at homebuild:~$ g++ -o test test.cpp
> test.cpp: In function ‘int main()’:
> test.cpp:11:4: error: no match for ‘operator+=’ (operand types are ‘S’
> and ‘S’)
> a += b;
> ~~^~~~
>
> Doesn't seem to "just work" for me...
I was about to say the same. C++ does not have this feature. What it has
as a feature and as a guideline is to define an operator+ outside of the
type's definition. Perhaps that's what's helping in C++ in this case:
the type looks clean but there are "interface" functions outside of it.
I've used the following trick in D for many of my types, which I've been
copy-pasting but it can be mixed in:
struct S {
float a;
float b;
int opCmp(const(typeof(this)) that) const {
import std.typecons : tuple;
return tuple(this.tupleof).opCmp(tuple(that.tupleof));
}
}
unittest {
assert(S(3) < S(4));
assert(S(1, 2) > S(1, 1));
}
void main() {
}
Ali
More information about the Digitalmars-d-learn
mailing list