K ++中的C ++ Enum等价物

时间:2017-11-15 09:51:24

标签: enums kotlin

我想解决的问题:

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

我认为Kotlin枚举对此并不好,因为每个枚举都是一个对象实例本身。我可以使用Int常量,但后来我失去了类型安全性。

在c ++中,这个问题由Enum解决。可以将枚举转换为其基础类型(在编译时)以用作索引。在同一类型中,Enum是一个类型,如果一个函数将它作为一个参数,编译器就不允许传入整数。枚举本身不是对象本身,所以你可以拥有任意多个,而不需要任何对象。表现很受欢迎。

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
}

3 个答案:

答案 0 :(得分:2)

如何使用枚举元素定义枚举以及所需类型的索引列表的扩展?这样,如果需要,您可以仅将索引功能限制为Foo列表。否则,将扩展名设为通用。

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

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

使用import com.example.Index.*引用仅FIRSTSECOND的元素。

或者定义一个不会与运算符混淆的非运算符函数:

fun List<Foo>.getElement(index: Index) = get(index.ordinal)

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

但是,我并不认为目前有一种解决方案可以让你对不同类型的整数都有假名,并避免在运行时为它们设置实例(好吧,也许是自定义)编译时的源转换会)。最接近允许的概念是value types,但目前JVM和Kotlin都不支持它。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

你在第二个= 1后面有一个逗号,

删除它:

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