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