On 2014-10-18 21:52:30 +0000, Shammah Chancellor said:

On 2014-10-15 17:29:33 +0000, Trass3r said:

http://youtu.be/qwXq5MqY2ZA?t=33m57s

I wish we had diagnostics like that in D.

I have answered your call:

https://github.com/D-Programming-Language/phobos/pull/2627

Please comment.

-S.

I don't know if anyone looked at this yet, but I've updated it quite a bit since the original post. Please take a look again and comment. It also generates some useful DDoc now.

Docs:


bool isConcept(T, C, bool diagnostics = false, string errorPrefix = "")();
Returns true if T supports the concept C. Note, templated member functions are not supported currently.

Concepts should be defined as in the following example:
----
class CInputRange(E) : Concept
{
        abstract void popFront();
        @property abstract E front();
        bool empty;

//Optional Axioms function. This will be checked if it compiles, and that it returns true if it does.
        static bool Axioms(T)()
        {
                return true;
        }
}

class CInfinite() : Concept
{
        static bool Axioms(T)() {
                enum empty = T.empty;
                return !empty;
        }
}

class CInfiniteInputRange(E) : CInputRange!E
{
        mixin CInfinite;
}
---

template conceptDiagnostic(R, string F, int L, C...)
Prints error messages for why template instantiation failed.

Examples:
---
bool DoStuff(R)(R infRange) if ( isConcept!(R, CInfiniteInputRange!string))
{
        return true;
}

bool DoStuff(R)(R infRange) if ( isConcept!(R, COutputRange!string))
{
        return true;
}

//Example of using conceptDiagnostic
bool DoStuff(R, string F = __FILE__, size_t L = __LINE__ )(R infRange)
{
mixin conceptDiagnostic!(R, F, L, COutputRange!string, CInfiniteInputRange!string);
        return false;
}
---

class Concept;
Base class for Concepts. All Concepts should derive from this, or another concept.

Reply via email to