import std.traits;
interface I { I clone(); }
class C : I
{
override C clone()
{
return new C;
}
}
void main()
{
{
static assert(isCovariantWith!(typeof(C.clone), typeof(I.clone)));
}{
C function() derived;
I function() base;
base = derived;
static assert(isCovariantWith!(typeof(derived), typeof(base)));
}{
C delegate() derived;
I delegate() base;
base = derived;
static assert(isCovariantWith!(typeof(derived), typeof(base)));
}
}
dmd 2.056から関数とデリゲートのcovarianceが考慮されるようになったので,たまたま見つけたisCovariantWithでも判定できるかと思ってやってみたら動かなかった.
isCovariantWith(F,G)のconstraintを消したら動いたけど,あれって必要なのかな?
そもそも,static assert(is(main == function);がfalseなんだけどis(... == function)ってどういうものだったっけ・・・.
typeof(main) == functionだった.
template isCovariantWith(F, G)
if (is(F == function) && is(G == function) ||
is(F == delegate) && is(G == delegate) || isFunctionPointer!F && isFunctionPointer!G)
こうかな.
import std.traits;
interface I { I clone(); }
class C : I
{
override C clone()
{
return new C;
}
}
void main()
{
{
static assert(isCovariantWith!(typeof(C.clone), typeof(I.clone)));
}{
C function() derived;
I function() base;
base = derived;
static assert(isCovariantWith!(typeof(*derived), typeof(*base)));
static assert(isCovariantWith!(typeof(derived), typeof(base)));
}{
C delegate() derived;
I delegate() base;
base = derived;
static assert(isCovariantWith!(typeof(derived), typeof(base)));
}{
C function() derived;
I delegate() base;
}
}