洞察探索如何通过一套代码实现跨平台小程序开发与高效管理,助力企业数字化转型
544
2022-10-19
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~