On Tuesday, 14 April 2015 at 15:20:37 UTC, bitwise wrote:
When I uncomment the nicer syntax, I get the errors below:
[1] Error: variable refl cannot be read at compile time
[2] Error: CTFE failed because of previous errors in base
class Base {
double d = 0.4;
}
class Test : Base {
int x = 4;
}
abstract class Refl {
@property abstract string name() const;
@property abstract string baseName() const;
}
class ClassRefl(T) : Refl {
@property override string name() const {
return T.stringof;
}
@property override string baseName() const {
alias BaseClassesTuple!T base_types;
return base_types[0].stringof;
}
}
const(Refl) reflect(T)() {
static const(Refl) refl = new ClassRefl!T;
return refl;
}
const(Refl) reflect(string name)() {
mixin("return reflect!(" ~ name ~ ");");
}
//const(Refl) base(const(Refl) refl) {
// return reflect!(refl.baseName()); ERROR [1]
//}
void main()
{
static const(Refl) refl = reflect!Test;
static const(Refl) baseRefl = reflect!(refl.baseName());
//static const(Refl) baseRefl = refl.base; ERROR [2]
writeln(refl.name);
writeln(baseRefl.name);
}
If anyone can offer a work around it would be much appreciated.
Minimal changes to what you have now; gives you `base!refl`
instead of `refl.base`:
----
const(Refl) base(alias refl)() {
return reflect!(refl.baseName());
}
static const(Refl) baseRefl = base!refl;
----
Digging deeper:
----
abstract class Refl {
@property abstract string name() const;
immutable(Refl) base() const;
}
class ClassRefl(T) : Refl {
@property override string name() const {
return T.stringof;
}
override immutable(Refl) base() const
{
alias BaseClassesTuple!T base_types;
static if(base_types.length > 0)
{
static immutable(Refl) instance = new
ClassRefl!(base_types[0]);
return instance;
}
else return null;
}
}
static const(Refl) baseRefl = refl.base;
----
Parting thoughts:
I don't know where you're heading with this. But so far I don't
see what it would buy you over std.traits and
TypeInfo/TypeInfo_Class.