gpt4 book ai didi

c++ - 在 Selene 中包装一个枚举以便在 Lua 中访问

转载 作者:太空宇宙 更新时间:2023-11-04 13:18:43 28 4
gpt4 key购买 nike

我正在使用 Selene包装 C++ 类和函数以便从 Lua 访问。我有一个简单的枚举类:

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

我想将它包装在 Lua 状态中,这样我就可以在 Lua 中说出类似“Motion.DOWN”的内容并得到 1。

第一次尝试:

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

编译器提示它不是一个类。

...
/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,
...

第二次尝试:

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

这不会编译,出现关于“expecting primary expression”的错误,它不是有效的 C++。如果我尝试使用 &Motion,我会遇到同样的错误。

有没有办法做到这一点?最好不要让我再次列出所有枚举常量。

最佳答案

这在 Selene 中是不可能的。

我采用的解决方案是定义一个类 DynEnum,它在内部使用映射来跟踪标签和值。

/**
* 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;
};

然后像这样实例化对象:

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

然后使用 Selene 绑定(bind):

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

此方法有性能开销,但在我的应用程序中这不是什么大问题。它还具有允许在 Lua 中从数字转换为字符串的优点,这有助于调试。

关于c++ - 在 Selene 中包装一个枚举以便在 Lua 中访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185075/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com