当前位置:   article > 正文

2402d,d的符号成员

2402d,d的符号成员

原文

标识类型

符号标识的格式为:name.
它既是一个类型,也是一个.:name类型有个:name值.

可在sumtypes中的"类型标签"项中使用此功能,以区分相同类型的项,如(:cenimeters,int|:meters,int).

还可用来构造无值sumtype项,如(int|:none).

这是一项我叫符号成员新功能.

它基于上面Neat标识类型.

在某些语句和式中,有个环境,当与符号一起查看时,它会取成员并重写AST以使用它.

支持函数调用,变量声明,switch语句的case语句及返回式.

尽管应该,但尚未实现点式.

为什么要实现它?为了证明即使是知识有限的我也可做到.这不复杂.在@dkorpel的帮助下,不到10个小时的工作就指向了正确的方向!

动机是在无值描述类型下,描述和类型标签.它也适合零成本值类型异常,来替换零大小结构.

包含所有示例的测试用例:

extern(C) void printf(const char*, ...);

extern(C) void main() {
    int varB = :max;
    Context varS = :max;
    Enum varE = :End;
    Enum varF1 = functionReturn();
    Enum varF2 = identity(:Middle);
    printf("%d <> %d <> %d <> %d <> %d\n", varB, varS.value, varE, varF1, varF2);

    switch(varF1) {
        case :Start:
            static assert(!__traits(compiles, { const fail = :max; }));
            break;
        default:
            assert(0);
    }

    static assert(!__traits(compiles, { const fail = :max; }));
    static assert(!__traits(compiles, { Context fail = :max.min; }));
}

struct Context {
    int value;
    enum Context min = Context(int.min);
    enum Context max = Context(int.max);
}

enum Enum {
    Start,
    Middle,
    End
}

Enum functionReturn() {
    return :Start;
}

Enum identity(Enum input) {
    return input;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

但值得复制的困难枚举varF2=identity(:Middle);.
也可:

Enum varF2 = identity(:Middle);

Enum identity(Enum e) {
    return e;
}

enum Enum {
    Middle
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/111227
推荐阅读
  

闽ICP备14008679号