<div dir="ltr">I don&#39;t currently have a use for it, but I can certainly see how this might be useful to some people.<div><br></div><div>As a side note, though, it seems like the consensus is that the optimization shown in your specific example, which is provided by std::vector&lt;bool&gt; in C++, is now widely regarded as a poor design choice. See, for instance, &lt;<a href="http://stackoverflow.com/questions/17794569/why-is-vectorbool-not-a-stl-container">http://stackoverflow.com/questions/17794569/why-is-vectorbool-not-a-stl-container</a>&gt;, &lt;<a href="https://isocpp.org/blog/2012/11/on-vectorbool">https://isocpp.org/blog/2012/11/on-vectorbool</a>&gt;, and &lt;<a href="http://www.gotw.ca/publications/N1211.pdf">http://www.gotw.ca/publications/N1211.pdf</a>&gt;.</div><div><br></div><div>It would be interesting to see if you can come up with a use case where the proposed feature is a clear win as opposed to just having a totally separate type that makes clear it&#39;s not quite the same thing under the hood (in your example, something like `BitArray`).</div><div><br><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 23, 2016 at 3:32 PM, David Sweeris via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word">(I feel like I’ve already written this... I looked through my sent mail and didn’t see anything, but my sincerest apologies if I started this thread a month ago and forgot about it or something.)<div><br></div><div>I no longer recall exactly what first made me want to do this (probably something in my on-going “teach the compiler calculus” project), but I’ve been thinking lately that it could be quite handy to overload types themselves based on the value of generic parameters. As a somewhat contrived example:</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div style="margin:0px;line-height:normal;font-family:menlo;color:rgb(0,132,0)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(187,44,162)">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Array &lt;T&gt; { </span><span style="font-variant-ligatures:no-common-ligatures">/*everything exactly as it is now*/</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> }</span></div></div><div><div style="margin:0px;line-height:normal;font-family:menlo;color:rgb(0,132,0)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(187,44,162)">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Array &lt;T&gt; </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(187,44,162)">where</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> T == <span style="color:rgb(112,61,170)">Bool</span><span style="font-variant-ligatures:no-common-ligatures"> { </span><span style="color:rgb(0,132,0);font-variant-ligatures:no-common-ligatures">/* packs every 8 bools into a UInt8 for more efficient storage */</span><span style="font-variant-ligatures:no-common-ligatures"> }</span></span></div></div></blockquote><div><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"><br></span></div><div>We can already do this with functions… Conceptually this isn’t any different. As long as the specific version exposes everything the generic version does (easy for the compiler to enforce), I <i>think</i> everything would just work (famous last words). In this example, the subscript function would need to extract the specified bit and return it as a Bool instead of simply returning the specified element. The `Element` typealias would be `Bool` instead of `UInt8`, which would mean the size/stride might be different than expected (but that’s why we have `MemoryLayout&lt;&gt;`).</div><div><br></div><div>Anyway, because generic structs &amp; functions already can’t make assumptions about a generic argument (beyond any constraints, of course), I <i>think</i> this should be in phase 2… but I’m quite hazy on how generics work once the code’s been compiled, so maybe not.</div></div><div><br></div><div>- Dave Sweeris</div><div><br></div></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div></div></div>