2015-12-26 2 views
0

НапримерКак я могу получить тип значения члена перечисления

template EnumValueType(T) 
if (is(T == enum)) 
{ 
    alias EnumValueType = /* ??? */; 
} 

enum E: ubyte {e0 = 123} 
enum D: float {d0 = 0.5} 

void main() 
{ 
    E e; 
    D d; 
    assert(is(EnumValueType!(typeof(e)) == ubyte)); 
    assert(is(EnumValueType!(typeof(d)) == float)); 
} 

До сих пор я могу обнаружить, только если это перечисление. Я вижу способ сделать это, но это плохо. Он состоял бы в итерации через AliasSeq seq, выполненный из базовых типов D, и чтобы узнать, может ли T быть переведенным на seq [n].

Любая другая идея?

ответ

1

Вы также можете std.traits.OriginalType.

is возвращает первый базовый тип перечисления, который может быть другим перечислением. OriginalType продолжает расширение, пока не получит фактический базовый тип.

enum E : real { a } 
enum F : E { a = E.a } 

static if(is(F Base == enum)) 
    pragma(msg, Base); // Prints "E" 
else 
    static assert(false); 

import std.traits; 
pragma(msg, OriginalType!F); // Prints "real" 
+0

Я вижу, на самом деле черта, в которой я нуждался, уже находится в фобосах ... –

2

Вы можете использовать один из многих версий is expression:

enum E : float 
{ 
    E1 = 2.0 
} 

static if (is(typeof(E.E1) Base == enum)) 
{ 
    pragma(msg, Base); // float 
} 

Реализация нужного шаблона может выглядеть следующим образом:

template EnumValueType(T) 
    if (is(T == enum)) 
{ 
    static if (is(T Base == enum)) 
     alias EnumValueType = Base; 
} 
Смежные вопросы