ダックタイピングでUFCS
を使用することはできますか?この場合、fooはダックタイプTestB
のbaz関数を実行できませんでした。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
}
しかしこれは、ufcs関数を使って新しい型を追加したい場合は、いつも 'foo'が変更されることを意味します。それを避ける方法はありますか? –
私は特定の型の 'foo'を特化してからufcs関数をインポートすることができたと思いますが、それは非常にハッキリです。 –
問題はUFCSがあなたのスコープから関数が見えている場合にのみ機能するということです。あなたが持っていたのは: --- ad --- void foo(T)(auto ref T obj){writeln( "General "); } --- b.d --- void foo(T:string)(自動参照オブジェクト){writeln( "Special"); } --- main.d --- void main() { import a.d; foo( "bar");特別な関数がmain.dには知られていないので、これは "General"を出力します。 } –