On 08/02/2017 02:07 PM, Timoses wrote:
Hey,
wondering whether it's possible to access the derived type from a
function template in the base class or interface.
this T does not seem to be working, I guess because it's a static
function and this does not exists?!
[...]
Any way I could accomplish this?
Well, it's a clumsy workaround, but the only thing missing seems to be
the "this T" automatic deduction. I was recently hit by something
similar: the "this" parameter deduction only works for instance methods.
It was not totally clear if it was a bug or a feature... The
documentation [1] is however quite clear:
TemplateThisParameters are used in member function templates to pick up the type of the this reference.
So, static functions doesn't seem to be covered.
You can, however, make it explicit:
```
B.test!B();
C.test!C();
```
And then even alias it to prevent accidental mismatches:
```
import std.stdio;
interface I
{
static void test(this T)()
{
writeln(T.type.stringof);
}
}
abstract class A
{
static void test(this T)()
{
writeln(T.type.stringof);
}
}
class B : A
{
alias type = uint;
}
class C : I {
alias type = int;
}
void main() {
test!B();
test!C();
}
alias test(T) = T.test!T;
```
[1]: http://dlang.org/spec/template.html#TemplateThisParameter