On Sun, 27 Nov 2011 02:40:08 +0200, Kapps <[email protected]> wrote:

Which brings in, compile-time interfaces. It seems like a natural thing to include when you have the above tools. Instead of having a method such as:
auto DoSomething(T)(T Data) if(isInputRange!(T)) { }
You could simply do:
auto DoSomething(Range Data) { }
where Range is defined as:
enum interface Range {
        void popFront() const;
        @property bool empty() const;
        @property auto front();
}
Much nicer than this very confusing looking statement (taken from std.range):
template isInputRange(R)
{
     enum bool isInputRange = is(typeof(
     {
         R r;              // can define a range object
         if (r.empty) {}   // can test for empty
         r.popFront();     // can invoke popFront()
         auto h = r.front; // can get the front of the range
     }()));
}

I sort of like the current solution, (it uses the language's most powerful feature) but for such common use the syntax is ugly. As it was suggested many times (std.meta), we really need to simplify this to at least something like:

template isInputRange(R)
{
     enum bool isInputRange = compiles
     {
         R r;              // can define a range object
         if (r.empty) {}   // can test for empty
         r.popFront();     // can invoke popFront()
         auto h = r.front; // can get the front of the range
     }
}

Reply via email to