How to get an inout constructor working with a template wrapper
aliak
something at something.com
Sat Jul 28 22:09:14 UTC 2018
On Friday, 27 July 2018 at 14:38:27 UTC, Steven Schveighoffer
wrote:
> On 7/27/18 9:29 AM, aliak wrote:
>> Ok, thanks to Simen from another post [0], I just figured out
>> what the correct constructor and factory method for a template
>> wrapper should be:
>>
>> https://run.dlang.io/is/S4vHzL
>>
>> struct W(T) {
>> T val;
>> this(U : T, this This)(auto ref U val) {
>> this.val = val;
>> }
>> }
>>
>> auto wrap(T)(auto ref T t) {
>> return W!T(t);
>> }
>>
>> Seems to catch all cases!
>
> And instantiate a new template for all mutabilities. Whereas
> inout would only instantiate one (and disallows modification of
> val if not const or immutable).
>
> -Steve
If you change the ctor to be inout then you get (from the link
above):
onlineapp.d(4): Error: cannot implicitly convert expression val
of type onlineapp.C to inout(C)
onlineapp.d(28): Error: template instance
`onlineapp.W!(C).W.__ctor!(C)` error instantiating
onlineapp.d(4): Error: cannot implicitly convert expression val
of type S1 to inout(S1)
onlineapp.d(44): Error: template instance
`onlineapp.W!(S1).W.__ctor!(S1)` error instantiating
onlineapp.d(4): Error: cannot implicitly convert expression val
of type onlineapp.C to inout(C)
onlineapp.d(9): Error: template instance
`onlineapp.W!(C).W.__ctor!(C)` error instantiating
onlineapp.d(52): instantiated from here: wrap!(C)
onlineapp.d(4): Error: cannot implicitly convert expression val
of type const(C) to inout(const(C))
onlineapp.d(9): Error: template instance
`onlineapp.W!(const(C)).W.__ctor!(const(C))` error instantiating
onlineapp.d(53): instantiated from here: wrap!(const(C))
Am I applying inout incorrectly?
More information about the Digitalmars-d-learn
mailing list