d插件模板用例
原文
如下会报错.
mixin template sum(T, R) {
R opBinary(string op)(T rhs) const
if (op == "+"){
return R(x + rhs.x, y + rhs.y, z + rhs.z);
}
}
mixin template diff(T, R) {
R opBinary(string op)(T rhs) const
if (op == "-") {
return R(x - rhs.x, y - rhs.y, z - rhs.z);
}
}
struct point{
float x, y, z;
mixin diff!(point, vec);
mixin sum!(vec, point);
}
struct vec{
float x, y, z;
}
void main(){
point p1 = {1,2,3}, p2 = {5,6,7};
vec v1 = p1-p2;
vec v2 = {2,-1,0};
point p3 = p1+v2;
}
这样也同样出错:
mixin template sumDiff(T, R){
R opBinary(string op)(T rhs) const
if (op == "+" || op == "-"){
return mixin("R(x " ~ op ~ " rhs.x, y " ~ op ~ "rhs.y, z " ~ op ~ " rhs.z)");
}
}
不用插件模板,却正常工作:
struct point{
float x, y, z;
vec opBinary(string op)(point rhs) const
if (op == "-") {
return vec(x - rhs.x, y - rhs.y, z - rhs.z);
}
point opBinary(string op)(vec rhs) const
if (op == "+") {
return point(x + rhs.x, y + rhs.y, z + rhs.z);
}
}
struct vec{
float x, y, z;
}
void main(){
point p1 = {1,2,3}, p2 = {5,6,7};
vec v1 = p1-p2;
vec v2 = {2,-1,0};
point p3 = p1+v2;
}
像编译器错误,因为真正方法替换插件模板
代码编译得很好.
另外,删除const
,否则即使修复
错误,该方法也只会在const
实例上使用.
mixin template sum(T, R) {
R opBinary(string op)(T rhs) const
if (op == "+"){
return R(x + rhs.x, y + rhs.y, z + rhs.z);
}
}
mixin template diff(T, R) {
R opBinary(string op)(T rhs) const
if (op == "-") {
return R(x - rhs.x, y - rhs.y, z - rhs.z);
}
}
struct point{
float x, y, z;
mixin diff!(point, vec);
mixin sum!(vec, point);
}
struct vec{
float x, y, z;
}
void main(){
point p1 = {1,2,3}, p2 = {5,6,7};
vec v1 = p1.opBinary!"-"(p2); // 显式调用
vec v2 = {2,-1,0};
point p3 = p1.opBinary!"+"(v2); // 显式调用
}
这似乎是编译器
中的错误
.可用插件模板
来插件重载符号
,但不能用多个插件模板
.
这样管用:
mixin template both(T, R) {
R opBinary(string op : "+")(T rhs) const
{
return R(x + rhs.x, y + rhs.y, z + rhs.z);
}
T opBinary(string op : "-")(R rhs) const
{
return T(x - rhs.x, y - rhs.y, z - rhs.z);
}
}
struct point{
float x, y, z;
mixin both!(vec, point);
}
它也可用opBinary
直接调用:
vec v1=p1.opBinary!"-"(p2);
这是直接遗漏
了重载符号
.应该提交错误
.
它只能一个mixin
模板.也不能重载类型自身
.
注意,我也认为串插件
可很好地工作.并且UFCS
对重载符号
不起作用,但这是设计原因.
是的,这里有多个名
,因此不会重载名字,并且类型上名会覆盖mixin
模板中名.最好在类型上别名
它们.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现