d重载操作符

网友投稿 506 2022-10-19

d重载操作符

d重载操作符

​​原文​​

struct Struct{ void opOpAssign(string op)(Struct rhs)//在此实现`/=`. { //... }}unittest{ Struct a = Struct(1); Struct b = Struct(2); a /= b; assert(a == Struct(5, 0, -1));}

单元测试,不管用.

但如下,通过测试:

struct S { int n; void opOpAssign(string op)(S rhs) if (op == "/") { n++; }}unittest { auto a = S(1), b = S(2); a /= b; b /= a; assert(a.n == 2); assert(b.n == 3);}

问题是,根据未调用​​opOpAssign​​​,为什么? 可能:

struct S { int n; void opOpAssign(string op)(S rhs) if (op == "/=") { n++; } void opOpAssign(string op)(S rhs) if (op == "/") { // 闲着 }}unittest { auto a = S(1), b = S(2); a /= b; b /= a; assert(a.n == 2); assert(b.n == 3);}

可用​​-vcg-ast​​​,让​​编译器​​​告诉你实际​​调用​​的是什么.

输出,用途不大:

unittest{ S a = S(1); S b = S(2); a.opOpAssign(b); b.opOpAssign(a); assert(a.n == 2); assert(b.n == 3);}

最后,只有1个实例化:

opOpAssign!"/"{ pure nothrow @nogc @safe void opOpAssign(S rhs) { }}

我希望包括​​模板参数​​​!我相信它通常会?应该​​提交​​错误.应该提出增强请求:

void foo(string s, T)(T t) {}void main(){ foo!"hi"(1);}//输出:void foo(string s, T)(T t){}void main(){ foo(1); return 0;}

文档说:​​a op= b​​​应重写为​​a.opOpAssign!("op")(b)​​​,这里没有​​=​​​,只剩下有效​​调用​​​.未用其他模板. 我意思是,​​​-vcg-ast​​​未告诉你它如何​​调用​​​函数. 如果​​​用​​​了其他模板怎么办? 这是实例化​​​foo​​​两次并调用了它​​3次​​​的代码中的​​AST​​,告诉我,谁调用了谁?

import object;void foo(string s, T)(T t){}void main(){ foo(1); foo(1); foo(1); return 0;}mixin _d_cmain!(); // 为了简单,省略了.foo!("hi", int){ pure nothrow @nogc @safe void foo(int t) { }}foo!("bar", int){ pure nothrow @nogc @safe void foo(int t) { }}

我用​​static if​​测试,假定是错的.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一个sql驱动程序能够包装任何其他驱动程序并记录/跟踪其所有调用
下一篇:SpringBoot接口中如何直接返回图片数据
相关文章

 发表评论

暂时没有评论,来抢沙发吧~