How to get an inout constructor working with a template wrapper

Ali Çehreli acehreli at yahoo.com
Sun Jul 22 23:11:09 UTC 2018


On 07/22/2018 03:51 PM, aliak wrote:
 > Hi,
 >
 > In the code below:
 >
 > struct W(T) {
 >      T val;
 >      this(T val) inout {
 >          this.val = val;
 >      }
 > }
 >
 > class C {}
 >
 > void main() {
 >     W!C a = new C;
 >     immutable W!C b = new C;
 > }
 >
 > W!C a = new C results in: "Error: cannot implicitly convert expression
 > val of type C to inout(C)."
 >
 > If I remove the inout on the constructor then the error is on the other
 > line and is: "Error: mutable method W!(C).W.this is not callable using a
 > immutable object"
 >
 > If the class is changed to a struct through,  then the constructor with
 > inout works on both lines in main above.
 >
 > So I guess this has something to do with reference types (As the same
 > behaviour is exhibited if T == int*) What's the recommended way to
 > handle this?
 >
 > Cheers,
 > - Ali

Without much confidence on my side, first, I think you need to make the 
constructor parameter inout(T) as well. Otherwise, you may be making a 
const(W!T) initialized with a non-const T.

After that, I like the "type constructor" syntax in main_alt() below 
(which works) but a better approach is to use a convenience function 
like wrap() below:

struct W(T) {
     T val;
     this(inout(T) val) inout {
         this.val = val;
     }
}

class C {}

void main_alt() {
     auto a = W!C(new C);
     auto b = immutable W!(immutable C)(new C);
}

auto wrap(T)(inout T t) {
     return inout(W!T)(t);
}

void main() {
     auto a = wrap(new C);
     auto b = wrap(new immutable(C));
}

Ali
"taklitlerinden sakınınız" :o)



More information about the Digitalmars-d-learn mailing list