Ist es möglich, UFCS
mit Ente Typisierung zu verwenden? In diesem Fall konnte foo TestB
's baz function nicht ducken.Ducktyping mit UFCS
module a;
struct TestA{
void baz(){
import std.stdio;
writeln("Test A");
}
}
void foo(T)(auto ref T t){
t.baz();
}
module b;
struct TestB{}
void baz(ref TestB b){
import std.stdio;
writeln("Test B");
}
import a;
import b;
void main()
{
auto testa = TestA();
auto testb = TestB();
testb.baz(); // works
foo(testa); // works
foo(testb); // doesn't work
}
Aber das bedeutet, dass 'foo' jedes Mal geändert werden muss, wenn ich einen neuen Typ mit einer ufcs-Funktion hinzufügen möchte. Gibt es eine Möglichkeit, das zu vermeiden? –
Ich denke, ich könnte 'foo' für einen bestimmten Typ spezialisieren und dann die ufcs-Funktion importieren, aber das scheint sehr hacky zu sein. –
Das Problem ist, dass UFCS nur funktioniert, wenn die Funktionen aus dem Bereich, in dem Sie sich befinden, sichtbar sind. Wenn Sie hatten: --- ad --- void foo (T) (automatische Ref T obj) {writeln ("General "); } --- b.d --- void foo (T: string) (automatische Ref T obj) {writeln ("Special"); } --- main.d --- void main() { importieren a.d.; foo ("bar"); // dies wird "General" ausgeben, da die spezialisierte Funktion nicht bekannt ist. } –