我想这样做(由this支持),但我遇到了一个小问题(因为你不那么令人头疼的不愉快而淡化了)。
假设我是一个库编写者,我在 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); }
此代码导致“Jigglypuff!” 被打印而不是' Wigglytuff!',这是有道理的,因为定义runrun
只能在其模块中看到它可用的未进化的非专业形式。但是,我(和客户端代码)希望看到“Wigglytuff”而不是“Jigglypuff”。
在 C++ 中,我会namespace mod_a { ... }
围绕 run 的专门化进行说明,当试图确定runrun
调用的定义时,应该检查客户端代码的运行以及我的库代码,欢迎伴随这种行为而来的蠕虫罐头。
是否有一种惯用的 D 方式来组织此功能,以便该功能run
可能被故意劫持?具体来说,我想模仿 C++ 的全局函数在特殊特化下的行为方式。