Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums C++;Kotlin中的枚举等价项_Enums_Kotlin - Fatal编程技术网

Enums C++;Kotlin中的枚举等价项

Enums C++;Kotlin中的枚举等价项,enums,kotlin,Enums,Kotlin,我试图解决的问题是: 我有一个元素列表。列表可能很大,也可能有很多。我想通过索引访问它们。对于这些索引,我想使用文字而不是数字。我也希望这个词是强类型的,所以我不能把数字和它们混在一起 我认为Kotlin枚举不适合这样做,因为每个枚举本身就是一个对象实例。我可以使用Int常量,但这样我就失去了类型安全性 在C++中,这个问题用枚举来解决。枚举可以强制转换为其基础类型(在编译时)以用作索引。在同一类型中,枚举是一个类型,如果函数将其作为参数,编译器将不允许传入整数。枚举本身不是对象本身,因此您可以

我试图解决的问题是:

我有一个元素列表。列表可能很大,也可能有很多。我想通过索引访问它们。对于这些索引,我想使用文字而不是数字。我也希望这个词是强类型的,所以我不能把数字和它们混在一起


我认为Kotlin枚举不适合这样做,因为每个枚举本身就是一个对象实例。我可以使用Int常量,但这样我就失去了类型安全性

在C++中,这个问题用枚举来解决。枚举可以强制转换为其基础类型(在编译时)以用作索引。在同一类型中,枚举是一个类型,如果函数将其作为参数,编译器将不允许传入整数。枚举本身不是对象本身,因此您可以拥有任意数量的枚举,而不会影响性能

C++代码示例显示我正在寻找的内容:

string someArray[] = {"element 0", "element 1"};

enum class Index
{
    first = 0,
    second = 1,
};

string getElement(Index i)
{
    return someArray[(int)i];
}

void foo()
{
    auto element0 = getElement(Index::first);
    auto element1 = getElement(1);  // compile time error - parameter type mismatch
}

秒=1后面有一个逗号

删除以下内容:

enum class Index
{
  first = 0,
  second = 1
};

使用enum元素定义一个enum以及对所需类型的索引列表的扩展如何?这样,如果需要,您可以将索引功能仅限于
Foo
列表。否则,将扩展设为泛型

enum class Index { FIRST, SECOND }   
operator fun List<Foo>.get(index: Index) = get(index.ordinal)

// Usage:
val foo = listOfFoo[Index.FIRST]

但是,我认为目前还没有一种解决方案可以让您同时拥有不同类型整数的假名,并避免在运行时拥有这些整数的实例(好吧,也许在编译时进行自定义源代码转换可以)。最接近允许这样做的概念是,但目前JVM和Kotlin都不支持它。

数千个对象实际上很少,但您可以使用普通的Kotlin枚举,然后使用来优化它们。默认情况下会这样做,但您可能需要小心配置,不要忘记在配置后彻底测试应用程序。

“我认为Kotlin enum不适合这样做,因为每个枚举本身就是一个对象实例。”如果您担心对象创建,JVM上的枚举是单实例,只能为枚举的每个值创建一个对象实例。还是我误解了你的观点?@zsmb13因为我会使用枚举作为索引常量,所以不需要创建单例对象。列表中可能有数千个元素,因此可能有数千个索引。创建这么多对象似乎是不必要的开销。这并不能回答我的问题。逗号也没什么问题。我特别想找一个不为常量创建对象的解决方案。我想这样的解决方案是不可能的。
fun List<Foo>.getElement(index: Index) = get(index.ordinal)

// Usage:
val foo = listOfFoo.getElement(Index.FIRST)