Enums 在D中使用简单枚举数

Enums 在D中使用简单枚举数,enums,d,Enums,D,假设我有以下枚举: struct Test { string value; } Test new_test(string value) { Test t; t.value = value; return t; } enum Foo : Test { A = new_test("a"), B = new_test("b"), c = new_test("c"), } 我对一些事情感到困惑。如何将其传递给函数 void do_someth

假设我有以下枚举:

struct Test {
    string value;
}

Test new_test(string value) {
    Test t;
    t.value = value;
    return t;
}

enum Foo : Test {
    A = new_test("a"),
    B = new_test("b"),
    c = new_test("c"),
}
我对一些事情感到困惑。如何将其传递给函数

void do_something(Foo f) {

}
do_something(Foo.A);

// or

void do_something(Test t) {

}
do_something(Foo.A);
最后,有没有办法得到枚举的数值 比如说

A -> 0
B -> 1
C -> 2
简单地说:

Foo.A.id ???
当你写作时

 enum Foo {
     A = new_test("a"),
     B = new_test("b"),
     C = new_test("c"),
 }
您基本上是在创建一组命名的值。它们没有数值,就像你想的那样——它们只是规则结构。如果需要知道集合中某个值的索引(例如
getIndex(Foo.C)
将返回2),可以使用以下代码:

// Gets the index of an enum value in the enum it's part of.
int getIndex(T)(T value) if (is(T == enum)) {
    // Iterate over all the members of the enum, and return the index if it's a match.
    static foreach (i, member; __traits(allMembers, T)) {
        if (value == __traits(getMember, T, member))
            return i;
    }
    return -1;
}

正如你可能已经注意到的那样,无论哪种方法都可以传递信息。再说一遍,枚举并没有什么神奇之处。它们不是伪装成测试的数字,在任何方面都可以像测试一样使用。

我不知道你为什么要将
Foo
定义为测试。在这里,你可以有一个匿名枚举,比如:

enum Foo {
  a,
  b,
  c, 
}
或者将其定义为字符串:

enum Foo {
  A="a",
  B="b",
  C="c", 
}
在任何情况下,这取决于您的函数设计,如果函数只应接收
Foo
,则您应通过
Foo
,并通过
测试,如果您正在编写的函数应该与所有
Test
对象一起工作,而不仅仅是这3个预定义的
Test
s,那么通过
Test
将是您的选择,但是,如果您希望函数只与您定义的枚举一起工作,那么使用
Foo
,您就得到了要点

关于id,假设您可以让
Test
包含另一个名为
id
的字段,并使用数字初始化该字段,现在您可以使用该字段作为标识符:

struct Test {
    string value;
    int id;
}

Test new_test(string value, int id) {
    Test t;
    t.value = value;
    t.id = id;
    return t;
}

enum Foo : Test {
    A = new_test("a", 1),
    B = new_test("b", 2),
    c = new_test("c", 3),
}
现在,如果您想获得一个
Foo
的索引,可以使用traits:

auto i = [__traits(allMembers, Foo)].countUntil(Foo.B.to!string);