私はこれをやりたいと思っています(これでサポートされています)が、小さな問題にぶつかっています(あなたの頭痛が少なく不快でないために骨抜きにされています)。
私がライブラリ ライターで、D ファイルに次の関数があるとします。
module mod_a;
import std.stdio;
void run(T)(T v) { writeln("Jigglypuff!"); }
void runrun(T)(T v) { run(v); }
run
そして、オーバーロードして呼び出しようとする別のモジュールにクライアントコードがありますrunrun
:
import mod_a;
void run(T:double)(T v) { writeln("Wigglytuff!"); }
void main() { runrun(1.0); }
このコードの結果は「プリン!」になります。' Wigglytuff !' ではなく印刷されています。これは理にかなっています。なぜなら、 の定義は、そのモジュールで利用できる進化していない非専門化された形式runrun
しか見ることができないからです。しかし、私 (およびクライアント コード) は、'Jigglypuff' ではなく 'Wigglytuff' を見たいと思っています。
C++ では、呼び出しnamespace mod_a { ... }
の定義を決定しようとするときに、クライアント コードの実行をライブラリ コードと一緒に調べる必要があることを示すために、run の特殊化を回避し、runrun
そのような動作に伴うワームの缶を歓迎します。
run
関数が意図的にハイジャックされるようにこれを整理するための慣用的な D ウェイはありますか? 具体的には、アドホックな特殊化で C++ のグローバル関数が動作する方法を模倣したいと考えています。