Okay take a look at this:<br><br>import std.stdio;<br><br>void main()<br>{<br>}<br><br>T[] find(T, E)(T[] haystack, E needle)<br>    if (is(typeof(haystack[0] != needle) == bool))<br>{<br>    while (haystack.length &gt; 0 &amp;&amp; haystack[0] != needle) {<br>
        haystack = haystack[1 .. $];<br>    }<br>    return haystack;<br>}<br><br><br>T1[] find(T1, T2)(T1[] longer, T2[] shorter)<br>    if (is(typeof(longer[0 .. 1] == shorter) : bool) &amp;&amp; false)<br>{<br>    while (longer.length &gt;= shorter.length) {<br>
        if (longer[0 .. shorter.length] == shorter)<br>            break;<br>        longer = longer[1 .. $];<br>    }<br>    return longer;<br>}<br><br>unittest {<br>    string[] longer = [&quot;one&quot;, &quot;two&quot;];<br>
    string shorter = &quot;two&quot;;<br>    find(longer, shorter);<br>    <br>    writeln(is(typeof(longer[0 .. 1] == shorter) : bool) &amp;&amp; false); // writes false<br>}<br><br>I&#39;m tyring to make the code in the unittest use the first templated function. But it will fail because DMD matches the call to find to the second templated function. But it should never match the second template, I&#39;ve forced it&#39;s constraint to always evaluate to false. <br>
<br>The writeln() in the unittest has the copy of the constraint expression and it does evaluate to false. If I comment out the second template, this code will compile as DMD will match the first template.<br><br>I&#39;m using this forced &quot;&amp;&amp; false&quot; expression because I was trying out all sorts of type/value expressions but they never worked for me.<br>
<br>Anyways, I&#39;d appreciate any help here. :)<br><br><br><br><br><div class="gmail_quote">On Wed, Jul 28, 2010 at 5:22 PM, Andrej Mitrovic <span dir="ltr">&lt;<a href="mailto:andrej.mitrovich@gmail.com">andrej.mitrovich@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">These templates seem to be hard to get right. I guess with experience they get easier to write and comprehend. Anyways, thanks for the explanation.<div>
<div></div><div class="h5"><br><br><div class="gmail_quote">On Wed, Jul 28, 2010 at 4:44 PM, Philippe Sigaud <span dir="ltr">&lt;<a href="mailto:philippe.sigaud@gmail.com" target="_blank">philippe.sigaud@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="gmail_quote">On Wed, Jul 28, 2010 at 05:50, Andrej Mitrovic <span dir="ltr">&lt;<a href="mailto:andrej.mitrovich@gmail.com" target="_blank">andrej.mitrovich@gmail.com</a>&gt;</span> wrote:<br>

<div><br></div><div>I won&#39;t comment on the double/float issue, I do not anything about it.</div>
<div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>T[] find(T, E)(T[] haystack, E needle)<br>
    if (is(typeof(haystack[0] != needle) == bool))<br><br></div><div>
T1[] find(T1, T2)(T1[] longer, T2[] shorter)<br>
    if (is(typeof(longer[0 .. 1] == shorter) : bool))<br><br></div><div>
Also, Andrei, you never explained the if(is()) signature of the second templated function. I hope to get some pointers on that. :)<br>
</div></blockquote></div><div><br></div>I&#39;ll have a try at this one.<div>As you may know, the is(typeof()) syntax is a way to try to compile an expression and see if it works. If it works, it has a type, given by typeof and is(Type) returns true. So the first one is really saying: &quot;Hey compiler, may I compare an element of haystack (of type T) with an E</div>


<div>In this case, longer is an array. So longer[0] would be an element, a T1. There is no chance that shorter will match as an element cannot be equal to an array ... except, of course, if longer is an array of T2[]  (T1 == T2[]). Longer is a T2[][]. That may happen for arrays of strings, strings being arrays of chars. And I think that&#39;s the problem you have in your last unit test.<div>


<br></div><div>Anyway, he takes longer[0..1] to get a slice, which is a dynamic array, a T1[] and hence comparable to a T2[]... most of the time.</div><div><br></div><div>As for using &#39;: bool&#39; instead of &#39;== bool&#39; as in the first find(),  I don&#39;t think there is any difference in this case. I understand T == U as &#39;T is the exact same type as U&#39;, whereas T : U is for me &quot;T is a subtype of U&quot;. But then, a subtype of bool is pretty much constrained to be a bool. The T : U syntax is pretty much only used for classes : if(is(T : MyClass)) is saying : &#39;compile this only if T is a subclass of MyClass&#39;.</div>


<div><br></div><div><br></div><div>Philippe</div><div><br></div><div><br></div><div><br></div><div>, except if longer is in fact</div></div>
</blockquote></div><br>
</div></div></blockquote></div><br>