增补:另类的 Enum 函数
template ffand(alias v1,alias v2){ // 传入参数v1,v2 未做类型限定
enum ffand ={ // 定义一个不可变的enum
return (v1 + v2) // 代码在编译过程中进行实现,最终以结果呈现
}(); // 这个"()" 是必须的 这是传入的参数,也就是等于 void function(){}()
// 理解起来应该还行
}
enum ffdiv = (size_t v1,size_t v2){ // 非模板方式
return v1/v2;
};
enum ffval = ffand!(6,5); // 通过模板方式进行调用
enum ffval1 = ffdiv(6,5);
这个功能很赞,这个要比C/C++中的宏定义强大很多,基本就是一个完整的D语言解析(和运行时相关的内存地址调用一类的就别想了~,基本不可能)
基本语法
模板声明
mixin template 识别名 模板参数 约束条件(可选) { 内容 }
模板可通过参数及约束条件进行重载
模板调用
mixin 模板识别名 模板参数(可选) 识别名(可选)
通过模板识别名可以直接调用模板,或通过新建一个识别名来调用模板内容
模板范本
mixin template Foo(size_t addr,T) // 声明模板
{
size_t maddr = addr; // 传入参数
T mraw; // 传入类型
int x = 5; // 模板内容
}
mixin Foo!(0x400,ubyte); // 应用模板,在当前位置插入模板
struct Bar
{
mixin Foo!(0x400,ubyte); // 在当前位置插入模板
}
mixin Foo!(0x400,ubyte) Fdemo // 附带识别名的调用
Fdemo.x = 5; // 调用方式
mixin 表达式
mixin ( 参数 )
template GenStruct(string Name, string M1) // 模板
{
const char[] GenStruct = "struct " ~ Name ~ "{ int " ~ M1 ~ "; }"; // 模板输出
}
mixin(GenStruct!("Foo", "bar")); // 通过混入生成模板内容
mixin({return "int x = 5;";}()); // 另一种混入的方式
int foo(int x)
{
return mixin("x +", 1) * 7; // same as ((x + 1) * 7) // 另一种混入的方式
}
mixin 的参数类型多数情况下应为 const char[] 或 string 或返回类似的静态函数,在编译期间可完成功能的函数
调试
D语言中可以非常方便调试模板,错误记录可直接定位,比较C/C++来说优势是非常巨大的,
对于单独使用混入产生的调试问题可以通过给编译器增加mixin参数保留下mixin产生的代码进行调试.
LDC编译器
--mixin=<文件名>
DMD编译器
-mixin=<文件名>
历史记录
2021年2月3日: 增加另类的enum定义方式或enum函数