在 D 中,模板实例化是在 mixin 出现的范围内评估的,而不是在定义模板声明的地方。当在 mixin 出现的范围内评估 body 时,可以使用模板 mixins。但是,当我有一个模板函数并且我希望它的主体在调用范围内进行评估时,我该怎么办?我找不到将其翻译成等效的方法。
让我们以以下示例为例,其中包含两个模块,module1
并且module2
:
module module1;
import std.stdio;
public void test(string field)(string msg)
{
mixin("static if (__traits(isArithmetic, " ~ field ~ " )) \n"
~ " writeln(msg);\n");
}
和
module module2;
import module1;
struct Foo
{
int x;
float y;
};
void main()
{
module1.test!("Foo.x")("ok");
}
尝试编译失败并显示错误undefined identifier Foo.x
,因为 Foo 在 module1 中不可见。有没有办法以在模块2而不是模块1中评估模板参数的方式重写它。如果这是不可能的,有没有办法获得一个代表“Foo.x”的对象并将其作为模板参数传递?(这不会解决一般情况,但至少会有用)。