On Sunday, 20 August 2017 at 00:49:28 UTC, Nicholas Wilson wrote:

[...]

With DIP 1012 you should be able to go

 struct Container(T, bool safetyOn = true)
 {
        static if(safe)
                RefCounted!(T[]) data;
        else
                T[] data;

        auto opSlice() @safeIf!safetyOn {
                return Range(data, 0, data.length);
        }
 }

 template safeIf(bool cond)
 {
     static if (cond) alias safeIf = AliasSeq!(safe);
     else                   alias safeIf = AliasSeq!();
 }

or even just

 struct Container(T, FunctionSafety safetyOn = safe)
 {
        static if(safe)
                RefCounted!(T[]) data;
        else
                T[] data;

        auto opSlice() @safetyOn {
                return Range(data, 0, data.length);
        }
 }

Container!int foo; // Container!(int, safe)
Container!(int, system) bar;

This is indeed, a nice solution. I am a _bit_ worried about abuse, and loss of modularity, but aside from that, I think it's a better solution overall.

The only downside is that the second form leaves itself open to

Easily fixed with a template constraint, right?


This could potentially render a large portion of the projects on code.dlang.org broken though. What would be nice, is if code.dlang.org regularly built all the projects, and notified the authors of the breakage, possibly sending a list of recent compiler changes as well.

Reply via email to