On 02/04/2012 03:38 AM, Vidar Wahlberg wrote:
> Let's say I got a struct for a location on a 2-dimensional plane:
> struct Point {
> int x;
> int y;
> }
> Further I also need to represent a location in a 3-dimensional space:
> struct Coordinate {
> int x;
> int y;
> int z;
> }
> If these were classes instead I could simply make Coordinate inherit
> from Point and only add "int z;".
There is also template mixins to inject complete features into the code
(similar to C macros but without their gotchas).
The following templatizes the coordinate types, but you could use put
write everywhere:
import std.stdio;
template Point2D(T)
{
T x;
T y;
void foo2D()
{
writefln("Using (%s,%s)", x, y);
}
}
struct Coordinate(T)
{
mixin Point2D!T; // <-- Inject x, y, and foo2D() here
T z;
this(T x, T y, T z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
void main()
{
auto c = Coordinate!double(1.1, 2.2, 3.3);
c.foo2D();
}
You could insert the following line in any other scope and you would
have x, y, foo2D() inserted right there as well:
if (someCondition) {
mixin Point2D!T; // <-- Inject x, y, and foo2D() here
// ... use the local x, y, and foo2D() here
}
Of course 'static if' may be even more suitable in other cases.
Ali