Chain two different struct specialization

bearophile bearophileHUGS at lycos.com
Fri Mar 1 08:03:56 PST 2013


Andrea Fontana:

> BTW, compiler can't guess s1 and s2 weights, should it?
>
> if inside likeness() i write:
>
> enum test = first.weights.foo * second.weights.foo;
>
> it said that can't read first and second value at compile time.

firstWeights and secondWeights are compile-time constants, but 
the arguments you give to likeness are run-time values, so they 
are unknown at compile-time inside likeness.

There are ways to solve that problem, but I don't know how much 
good this is:


immutable struct Weights {
     double foo, bar;
}

enum Weights firstWeights  = { foo: 0.3, bar: 0.4 },
              secondWeights = { foo: 0.5, bar: 0.2 };

struct MyStruct {
     int prop, prop2;
     immutable Weights weights;

     this(Weights weights_, in int p, in int p2) pure nothrow {
         this.weights = weights_;
         this.prop = p;
         this.prop2 = p2;
      }
}

double likeness(alias first, alias second)() {
     enum test = first.weights.foo * second.weights.foo;
     double v = (first.prop - second.prop) *
                first.weights.foo * second.weights.foo;
     return v + (first.prop2 - second.prop2) *
                first.weights.bar * second.weights.bar;
}

void main() {
     enum s1 = MyStruct(firstWeights,  10,  8);
     enum s2 = MyStruct(firstWeights,   9, 10);
     enum s3 = MyStruct(secondWeights,  9, 10);

     import std.stdio;
     writeln(likeness!(s1, s2)());
     writeln(likeness!(s1, s3)());

     const r = [s1, s2, s3];
}

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list