2016-10-09 27 views
1

我想获得相同的行为CPP:我怎么可能会科特林枚举同样的行为作为CPP那些

enum dxgi_format_gli 
{ 
    DXGI_FORMAT_R64_UINT_GLI = 1, 
    DXGI_FORMAT_R64_SINT_GLI 
} 

其中DXGI_FORMAT_R64_UINT_GLI得到1和下得到2

我得到的最接近是:

​​

但是我想它,当然,是动态的,那就是每当我打电话带有参数的构造,保存一个在counter和下面所有的常量ructors增量和得到它..

我已经使得它在Java:

public enum Dxgi_format_gli { 

    DXGI_FORMAT_R64_UINT_GLI(1), 
    DXGI_FORMAT_R64_SINT_GLI; 

    public final int value; 

    private static class Counter { 

     private static short value = 0; 
    } 

    private Dxgi_format_gli() { 
     value = Counter.value; 
     Counter.value++; 
    } 

    private Dxgi_format_gli(int value) { 
     this.value = value; 
     Counter.value++; 
    } 
} 

但它使用科特林我没有做..

回答

2

我想你只需要设置的值和移动增量以使其工作 - 所以初始计数器和值是相同的。

enum class Dxgi_format_gli { 

    DXGI_FORMAT_R64_UINT_GLI(1), 
    DXGI_FORMAT_R64_SINT_GLI; 

    val value: Int 

    private object Counter { 
    var value: Int = 0 
    } 

    constructor() { 
    Counter.value++ 
    value = Counter.value.toInt() 
    } 

    private constructor(value: Int) { 
    this.value = value 
    Counter.value = value 
    } 
} 
+0

非常酷!你模仿了C++的最佳特性!看到我的答案为简短的方式。 – voddan

5

每个enum已经有一个自动生成的属性ordinal

enum class A {a, b, c} 

A.a.ordinal // 0 
A.b.ordinal // 1 
A.c.ordinal // 2 

所以在技术上得到你想要的最简单方法是dxgi_format_gli.DXGI_FORMAT_R64_UINT_GLI.ordinal + 1(我不知道为什么你不希望启动与0 0_o)

您可以使用此替换@ griffio的答案代码:

enum class Dxgi_format_gli { 

    DXGI_FORMAT_R64_UINT_GLI, 
    DXGI_FORMAT_R64_SINT_GLI; 

    val value = ordinal + 1 
} 
+0

感谢您的回答,但是我不是从'0'开始,因为这是我正在移植的cpp代码(有一个解释btw) – elect

+0

很酷的建议'val value = ordinal + 1' voddan,+1:p – elect