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;
----

     }
}


Reply via email to