2016-03-23 18 views
1

adresinden erişilebilir. Selene kullanıyorum. C++ sınıflarını ve Lua'dan erişilebilecek işlevleri sarmak için kullanıyorum.Selen'de bir enum'u Lua

: Ben 1.

İlk girişim Lua "Motion.DOWN" gibi bir şey demek ve almak böylece

enum class Motion { 
    UP = 0, 
    DOWN = 1, 
    REPEAT = 2, 
}; 

Bir Lua devlet içinde bu sarmak istiyorum: Ben basit bir enum sınıf var

void register(sel::State &L) { 
    L["Motion"].SetClass<Motion>(); 
} 

Derleyici, bir sınıf olmadığından şikayetçi.

... 
/source/desktop/../external/Selene/include/selene/Class.h:41:10: 
    error: creating pointer to member of non-class type 'Motion' 
void _register_member(lua_State *state, 
... 

İkinci girişimi:

void register(sel::State &L) { 
    L["Motion"] = Motion; 
} 

Bu, derlemek "birincil ifade bekleniyor" hakkında hataları almaz, bu ++ geçerli C değil. &Motion kullanmayı denediğimde aynı hataları alıyorum.

Bunu yapmanın bir yolu var mı? Tercihen, tüm enum sabitlerini tekrar listelemeyi gerektirmeyen bir.

cevap

0

Bu Selene'de mümkün değil.

Benim kabul ettiğim çözüm, etiketlerin ve değerlerin kaydını tutmak için bir haritayı kullanan bir DynEnum sınıfını tanımlamaktır. Böyle

/** 
* Simple class for enum values 
*/ 
class DynEnum { 
    public: 
    DynEnum(std::map<std::string, int> tbl) : tbl(tbl) {} 

    int of(std::string tag) { 
     if (tbl.count(tag) > 0) { 
      return tbl[tag]; 
     } 
     throw std::runtime_error("Enum tag not found"); 
    } 

    std::string lookup(int v) { 
     for (auto &p : tbl) { 
      if (p.second == v) { 
       return p.first; 
      } 
     } 
     throw std::runtime_error("Enum value not found"); 
    } 

    private: 
    std::map<std::string, int> tbl; 
}; 

Sonra örneğini nesneler:

DynEnum Motion({ 
    {"UP", 0}, 
    {"DOWN", 1}, 
    {"REPEAT", 2}, 
}); 

Sonra Selene kullanarak bağlamak:

L["Motion"].SetObj(Motion, 
    "of", &DynEnum::of, 
    "lookup", &DynEnum::lookup); 

Bu yöntem performans yükü vardır ama benim uygulamada bu büyük bir anlaşma değil. Ayrıca, hata ayıklamaya yardımcı olan Lua'da sayıdan dizeye dönüşüm yapılmasına izin verme avantajına da sahiptir.