digitalmars.D.learn - alias this with template class?
- Namespace (25/25) Jun 03 2012 I think this should work:
- Timon Gehr (8/29) Jun 03 2012 Making this generally work as you expect would be too hard.
- Namespace (47/47) Jun 03 2012 Fail.
I think this should work:
[code]
import std.stdio;
class Foo(T) {
public:
T Num;
property
Foo!(U) ConvertTo(U)() inout {
return cast(Foo!(U)) this;
}
alias ConvertTo this;
}
void Call(const Foo!(float) FFoo) {
}
void main() {
Foo!(ubyte) UbFoo = new Foo!(ubyte)();
Call(UbFoo);
readln();
}
[/code]
Why it doesn't?
Jun 03 2012
On 06/03/2012 08:43 PM, Namespace wrote:
I think this should work:
[code]
import std.stdio;
class Foo(T) {
public:
T Num;
property
Foo!(U) ConvertTo(U)() inout {
return cast(Foo!(U)) this;
}
alias ConvertTo this;
}
void Call(const Foo!(float) FFoo) {
}
void main() {
Foo!(ubyte) UbFoo = new Foo!(ubyte)();
Call(UbFoo);
readln();
}
[/code]
Why it doesn't?
Making this generally work as you expect would be too hard.
The compiler would have to reverse-engineer the 'ConvertTo' template
which is an undecidable problem in general. Some clever heuristics
might suffice for most practical instances though, but those are
very open-ended and therefore it is hard to incorporate them into the
language definition. If you think it should be done you could file a
suggestion (enhancement request) into the bug tracker.
Jun 03 2012
Fail.
Ok, i tried something like this:
[code]
import std.stdio;
mixin template TConvertTo(T : Object, U) {
T!(U) ConvertTo() inout {
return cast(T!U) this;
}
alias ConvertTo this;
}
class Foo(T) {
public:
T Num;
mixin TConvertTo!(typeof(this), float);
}
[/code]
but it fails with:
template_alias_this_cast.d(4): Error: template instance T!(float)
T is not a template declaration, it is a class
template_alias_this_cast.d(4): Error: T!(float) is used as a type
template_alias_this_cast.d(15): Error: mixin
template_alias_this_cast.Foo!(float).Foo.TConvertTo!(Foo,float)
error instantiating
template_alias_this_cast.d(19): Error: template instance
template_alias_this_cast.Foo!(float) error instantiating
If i change it to:
[code]
import std.stdio;
mixin template TConvertTo(V) {
Foo!(V) ConvertTo() inout {
return cast(Foo!V) this;
}
alias ConvertTo this;
}
class Foo(T) {
public:
T Num;
mixin TConvertTo!(float);
}
[/code]
it works. But i think my first idea should work, too.
Jun 03 2012








"Namespace" <rswhite4 googlemail.com>