On Friday, 16 May 2014 at 23:14:13 UTC, Idan Arye wrote:
On Friday, 16 May 2014 at 20:31:40 UTC, Phil Lavoie wrote:
The idea is to eventually be able to do something like this:
constraint InputRange(Elt) {
Elt front();
void popFront();
bool empty();
}
void myTemplateFunction( InputRange!int r ) {
foreach( elt; r ) { ... }
}
What do you think? Does this feel right to you?
Phil
The main problem is that `myTemplateFunction`'s signature makes
it look like it's a concrete function, when in fact it's a
template.
True. To me that is not a big issue though. It can lead to some
surprises I see your point but I would be ok with that.
Another problem is that we now have to have an argument if we
want to pass a template parameter, which is a serious
limitation.
Not sure I get what you mean. I didn't mean for the old syntax to
be abandonned if that makes sense, just to add some sugar to the
existing one.
How about if instead these constraint could be used in `is`
expressions like type specializations?
void myTemplateFunction(T)(T r) if(is(T : InputRange!int)) {
foreach(elt; r) { ... }
}
True, the syntax is less elegant, but it's more flexible, you
can easily tell that it's a template, and you can use the same
syntax in static branching.
It's interesting. But would it warrant a change from the usual
syntax, which would probably be:
void myTemplateFunction(T)(T r) if( isInputRange!(T, int)) {
foreach(elt; r) { ... }
}
?
Also it could be nice if a template can implement a constraint
like classes implement interfaces. Unlike classes&interfaces,
it shouldn't be a requirement that a template implements a
constraint in order for it to be used as parameter where the
constraint is expected. Rather, the compiler should check that
the template fulfills the constraint even if the template is
never instantiated(is this possible?). This could be a nice
mechanism for verifying templates.
Hmm do you mean like a struct "implementing" an interface?
struct MagicRange: InputRange {
...
}
Where it's not an actual interface but the compiler would check
it against the constraint(s). Which would be nice to make sure
that a type follows a given interface, although, as soon as it is
used as an InputRange you would know.
BTW - I'm don't think we need a new keyword for this - we can
use `interface template` instead.
Love it! Would "template interface" make more sense?