On Wednesday, 26 April 2023 at 18:24:08 UTC, DLearner wrote:
Consider:
```
struct S1 {
int A;
int B;
int foo() {
return(A+B);
}
}
struct S2 {
int A;
int B;
}
int fnAddS2(S2 X) {
return (X.A + X.B);
}
There are scenarios that won't let you use the second form, e.g.
putting your struct under the `with()` statement:
```d
with (S1) {
auto sum = foo(); // Works correctly
}
with (S2) {
auto sum = foo(); // Error: function foo(S s) is not callable
using argument types ()
}
```
In this case, the first option will be better. But there are no
real "best practices" defined AFAIK.
However, the second form let you generalize the pattern by using
template declaration:
```d
int fnAdd(T)(T v) {
return (v.A + v.B); // Doesn't matter what type is this if it
has both members A and B
}
s1.fnAdd();
s2.fnAdd();
```