monarch_dodra:
Is this not the case for D? Or is it currently a limitation?
In this case I think D is working as designed. All functions
inside a template are created when you instantiate it.
Can I ever expect we'll get a "conditionally compiled on
requirement" functionality for template struct member functions.
I have asked for a @templated(Arg1, Arg2, ...) that's usable for
this purpose too, but Walter has not commented so far.
struct C(T)
{
private T val;
static if(isAssignable(T!T))
{
@property void front(T value)
{val = value;}
}
}
Probably such use of a static if (or debug, version, etc) is the
idiomatic way to do what you want in D. It's easy to see and
understand for the person that reads the code.
struct C(T)
{
private T val;
@property void front()(T value)
{val = value;}
}
This works, and is correctly "conditionally compiled on
requirement". The signature is kind of kludgy, but it works...
AND, if someone *does* attempt to make the call, then a verbose
compile error appears.
This doesn't look bad, just remember this doesn't work:
struct C(T) {
private T val;
@property void front()(T value) {
val = value;
}
}
void main() {
C!int ci;
auto f = &ci.front;
assert(ci.val == 0);
f(1);
assert(ci.val == 1);
}
Bye,
bearophile