Andrea Fontana:

How to put s1,s2,3... in a range/array or something similar/iterable? Probably there's no way (inside variant?)...

One solution is to not use templates:



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 {
         prop = p;
         prop2 = p2;
     }
}

double likeness(in ref MyStruct first, in ref MyStruct second) {
        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() {
        immutable s1 = MyStruct(firstWeights,  10,  8);
        immutable s2 = MyStruct(firstWeights,   9, 10);
        immutable s3 = MyStruct(secondWeights,  9, 10);

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

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


Bye,
bearophile

Reply via email to