D语言中的混入型模板

增补:另类的 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函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值