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
}
}