小编F i*_*i L的帖子

优雅的运算符在D中重载

有一段时间我对D'运算符重载的方向感到困惑,但现在我意识到它是一个漂亮的系统...如果它只适用于核心类型(int,float等).考虑以下代码:

struct Vector {
    float X, Y;

    void opOpAssign(string op)(Vector vector) {
        X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
        Y.opOpAssign!op(vector.Y); // ERROR: ditto
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是漂亮的代码,如果它工作,看到它在一个方法中重载所有+ =, - =,*=等运算符.但是,正如您所看到的,它不是开箱即用的.我用模板创建了一个解决方案(上帝,我爱D):

template Op(string op, T) {
    void Assign(ref T a, T b) {
        static if (op == "+") a += b;
          else if (op == "-") a -= b;
          else if (op == "*") a *= b;
          else if (op == "/") a /= b;
    }
}

struct Vector {
    float …
Run Code Online (Sandbox Code Playgroud)

d operator-overloading dmd gdc

19
推荐指数
2
解决办法
2163
查看次数

D中的扩展函数

不久前我买了"D编程语言".好书,很有教育意义.但是,我在编写本书中列出的语言功能时遇到了麻烦:扩展功能.

在书中,Andrei写道任何函数(a,b)都可以调用,如:a.function(b); 所以我应该能够做到这一点:

struct Person {
    string name;
}

void foo(Person person, string name) {
    person.name = name;
}

void main() {
    auto bob = Person();
    bob.foo("Bob Dole");  // ERROR: Person does not have method 'foo'
}
Run Code Online (Sandbox Code Playgroud)

正确?这个功能还没有实现,或者我只是遗漏了什么?我注意到导入std.range会向数组添加方法,因此它似乎在某种程度上实现.

d dmd gdc

12
推荐指数
2
解决办法
339
查看次数

D表现:联盟vs @property

我正在将我们的统治SDK移植,增强和D-atizing 从C#到D.目前正在处理Vector2数学模块.

以下两种结构之间是否会有任何性能差异?我的基准测试表现出相同的性能,但我想获得一些专家见解:)

struct Vector2(T)
{
    T x, y;
    @property T u() { return x; }
    @property T v() { return y; }
    @property void u(T value) { x = value; }
    @property void v(T value) { y = value; }
}

struct Vector2(T)
{
    union { T x, u; }
    union { T y, v; }
}
Run Code Online (Sandbox Code Playgroud)

显然,我想使用工会来实现语法简洁.但使用它们有任何不可预见的陷阱吗?我不熟悉他们的低级细节.

另外,我正在添加类似于HLSL/GLSL的vector属性语法,例如,vec1.yxz + = vec2.xyz; 有......没有..可能的方式与工会而不是@property这样做?

benchmarking d dmd gdc

7
推荐指数
1
解决办法
219
查看次数

Mono-D DMD编译器问题

使用代码完成和简单重构等功能,在Mono-D中编写D几乎与在Visual Studio中编写C#一样高效.一切都在Linux上运行良好,只需安装Mono Develop,添加Mono-D存储库,然后构建; 但在Windows上我甚至无法编译Hello World.

起初似乎DMD找不到Phobos,但按照" 入门"页面上的说明操作后,我在Object.di文件中得到21个错误.错误如"找到'char'时期望')'""没有标识符声明者不可变".

我在Windows 7 64bit上使用Mono Develop 2.8.5.

任何人都知道如何让这个工作?

d monodevelop dmd

5
推荐指数
1
解决办法
438
查看次数

D opBinary()()重载错误?

当我尝试在一个简单的Vector结构上重载opBinary时,我得到一个奇怪且毫无意义的错误:

struct Vector(T)
{
    T x, y;

    Vector opBinary(string op)(Vector!float vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }

    Vector opBinary(string op)(Vector!double vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }
}

void main()
{
    auto dVec = Vector!double();
    auto fVec = Vector!float();

    auto aVec = dVec + fVec; // Adding this line causes error (see below)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误很简单:"opBinary(string op)".没有行号,没有.这显然不会给我很多东西继续下去.还有另一种方法来处理这种情况吗?这是一个已知的错误?

我在Windows 7上使用DMD 2.057.还没有在Linux上测试过.

[编辑]清理了一些代码以提高可读性.

overloading d operator-overloading dmd

2
推荐指数
1
解决办法
178
查看次数