On 25.01.2016 15:51, pineapple wrote:
class unitvalue{
double coefficient;
int[unit] exponents;
unitvalue copy(){
unitvalue value = new unitvalue();
value.coefficient = this.coefficient;
value.exponents = this.exponents.dup;
return value;
}
template opmethod(string methoddef, string methodcall){
const char[] methodtemplate =
Can't have variables like that in templates. Make it a "manifest
constant" with enum. Also, if you want opmethod!("foo", "bar") to
evaluate to the code, then methodtemplate needs to be renamed to
"opmethod". I.e., make this line:
----
enum opmethod =
----
Also, opmethod doesn't need to be template. A function would work as well:
----
static string opmethod(string methoddef, string methodcall)
{
return
"unitvalue " ~ methoddef ~ "{
unitvalue copy = this.copy();
copy." ~ methodcall ~ ";
return copy;
}"
;
}
mixin(unitvalue.opmethod(
"sum(in unitvalue value)", "add(value)"
));
----
"unitvalue " ~ methoddef ~ "{
unitvalue copy = this.copy();
copy." ~ methodcall ~ ";
return copy;
}"
;
}
mixin(unitvalue.opmethod!(
"sum(in unitvalue value)", "add(value)"
));
void add(in unitvalue value){
if(!this.samedimensions(value)){
throw new Exception("Cannot add values of differing
dimensions.");
}else{
this.coefficient += value.coefficient;
}
}
bool samedimensions(in unitvalue value){
return this.exponents == value.exponents;
This gives me an error, too: "Error: incompatible types for
((this.exponents) == (value.exponents)): 'int[int]' and 'const(int[int])'"
(I've aliased unit to int.)
As far as I can tell, this should work. There's a bugzilla issue for it:
https://issues.dlang.org/show_bug.cgi?id=13622
You can work around the bogus error message by using a const temporary
for this.exponent:
----
const this_exponents = this.exponents;
return this_exponents == value.exponents;
----
}
}