<div dir="ltr"><div>Looks very nice! I think I could make use of it. (Though I use D only recreationally :-) )<br><br></div>LMB<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Oct 19, 2014 at 7:10 PM, Shammah Chancellor via Digitalmars-d <span dir="ltr"><<a href="mailto:digitalmars-d@puremagic.com" target="_blank">digitalmars-d@puremagic.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">It was request that I create a NG thread about a module I was hoping to merge with phobos. (std.concepts)  Please take a look.<br>
<br>
Thanks in advance.<br>
<br>
-S<br>
<br>
Link to PR:<br>
<br>
<a href="https://github.com/D-Programming-Language/phobos/pull/2627" target="_blank">https://github.com/D-<u></u>Programming-Language/phobos/<u></u>pull/2627</a><br>
<br>
Docs:<br>
<br>
<br>
bool isConcept(T, C, bool diagnostics = false, string errorPrefix = "")();<br>
Returns true if T supports the concept C. Note, templated member functions are not supported currently.<br>
<br>
Concepts should be defined as in the following example:<br>
----<br>
class CInputRange(E) : Concept<br>
{<br>
        abstract void popFront();<br>
        @property abstract E front();<br>
        bool empty;<br>
<br>
        //Optional axioms function.  This will be checked if it compiles, and that it returns true if it does.<br>
        static bool axioms(T)()<br>
        {<br>
                return true;<br>
        }<br>
}<br>
<br>
class CInfinite() : Concept<br>
{<br>
        static bool axioms(T)() {<br>
                enum empty = T.empty;<br>
                return !empty;<br>
        }<br>
}<br>
<br>
class CInfiniteInputRange(E) : CInputRange!E<br>
{<br>
        mixin CInfinite;<br>
}<br>
---<br>
<br>
template conceptDiagnostic(R, string F, int L, C...)<br>
Prints error messages for why template instantiation failed.<br>
<br>
Examples:<br>
---<br>
bool DoStuff(R)(R infRange) if ( isConcept!(R, CInfiniteInputRange!string))<br>
{<br>
        return true;<br>
}<br>
<br>
bool DoStuff(R)(R infRange) if ( isConcept!(R, COutputRange!string))<br>
{<br>
        return true;<br>
}<br>
<br>
//Example of using conceptDiagnostic<br>
bool DoStuff(R, string F = __FILE__, size_t L = __LINE__ )(R infRange)<br>
{<br>
        mixin conceptDiagnostic!(R, F, L, COutputRange!string, CInfiniteInputRange!string);<br>
        return false;<br>
}<br>
---<br>
<br>
class Concept;<br>
Base class for Concepts. All Concepts should derive from this, or another concept.<br>
<br>
<br>
</blockquote></div><br></div>