如何实现自定义的d重载操作符功能?

2026-06-10 05:507阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计636个文字,预计阅读时间需要3分钟。

如何实现自定义的d重载操作符功能?

原文:简单改写伪原创以下开头内容,不要数数,不超过100个字,直接输出结果:原文:struct Struct { void opOpAssign(string op) // 在此处实现`=/` {...} }; unittest { Struct a=Struct(1); Struct b=Struct(2); a /=b; assert(a==Struct(5, 0, -1)); } 单元测试,不管用结果:重写:定义结构体`Struct`,实现除法赋值操作,执行单元测试验证。


​​原文​​

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​​​,让​​编译器​​​告诉你实际​​调用​​的是什么.

如何实现自定义的d重载操作符功能?

输出,用途不大:

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​​测试,假定是错的.


本文共计636个文字,预计阅读时间需要3分钟。

如何实现自定义的d重载操作符功能?

原文:简单改写伪原创以下开头内容,不要数数,不超过100个字,直接输出结果:原文:struct Struct { void opOpAssign(string op) // 在此处实现`=/` {...} }; unittest { Struct a=Struct(1); Struct b=Struct(2); a /=b; assert(a==Struct(5, 0, -1)); } 单元测试,不管用结果:重写:定义结构体`Struct`,实现除法赋值操作,执行单元测试验证。


​​原文​​

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​​​,让​​编译器​​​告诉你实际​​调用​​的是什么.

如何实现自定义的d重载操作符功能?

输出,用途不大:

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​​测试,假定是错的.