New syntax proposal for template type parameter contraints
Phil Lavoie via Digitalmars-d
digitalmars-d at puremagic.com
Fri May 16 13:31:39 PDT 2014
Hi, I'd like to share an idea I had. It was motivated by the
feeling I get when writing template functions and templates
altogether. The current template constraint mechanism is awesome
cuz it gives power and flexibility. However, I think it could be
improved, readibilty wise. Here is my suggestion:
//A new kind of type definition: constraint. Or metatype or
whatever.
//Can only be used where template type parameters are declared.
It CANNOT be used as a type declaration.
constraint InputRange {
/**
Not really executed, just to implement the constraints. Could
also be "invariant" or even a new type of block altogether.
*/
static this() {
InputRange r; //Can use the "type" directly, or
typeof(this).
auto f = r.front();
auto isEmpty = r.empty();
r.popFront();
}
}
//Can be used directly like an interface, but implies a template
underneath.
void myTemplateFunction( InputRange r ) {
foreach( elt; r ) {
//Do something clever.
}
}
Semantically equivalent to:
template __superManglingInputRange(T) {
static if(
is(
typeof(
() {
//Put what's in "static this" here.
T r;
auto f = r.front();
auto isEmpty = r.empty();
r.popFront();
}
)
)
) {
enum __superManglingInputRange(T) = true
} else {
enum __superManglingInputRange(T) = false;
}
}
void myTemplateFunction(T)( T r) if( __superManglingInputRange!T
) {
//The code.
}
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
More information about the Digitalmars-d
mailing list