У меня есть класс Entity
, который содержит некоторые атрибуты (фрагменты данных). Эти атрибуты хранятся в карте из имени => значение.
class Entity
{
public:
// Sets the attribute with the specified name.
void attribute(const std::string& name, const GenericType& value) {
m_attributes[name] = value;
}
// Returns the attribute with the specified name.
GenericType& attribute(const std::string& name) {
return m_attributes[name];
}
template<typename AttributeType>
void attribute(const std::string& name, const AttributeType& value) {
m_attributes[name] = GenericType(value);
}
template<typename AttributeType>
AttributeType& attribute(const std::string& name) {
return generic_cast<AttributeType>(m_attributes[name]);
}
private:
// Map of attributes from name => value.
std::unordered_map<std::string, GenericType> m_attributes;
}
У меня есть метод для создания или перезаписи атрибута и еще один метод, который возвращает атрибут с указанным именем. Первые два метода доступны для Lua. Последние два метода предназначены для доступа и изменения атрибутов из исходного кода C++. Проблема в том, что атрибуты могут быть любого типа. Например, я хочу иметь возможность:
entity.attribute("Health", 100)
entity.attribute("Position", Vector3(1,2,3))
entity.attribute("Position").x = 4
Должна быть возможность читать и изменять атрибуты как из исходных файлов C++, так и из сценариев lua. Раньше я использовал ChaiScript, где использовал Boxed_Value класс как мой GenericType
. Это работало хорошо, но чрезмерное время компиляции заставило меня искать в другом месте.
Есть ли способ добиться этого с помощью LuaBind (или любой другой библиотеки привязки Lua)? Класс luabind::object
выглядит многообещающе, но он принимает указатель lua_State
в своем конструкторе. Это беспокоит меня, так как я чувствую, что класс Entity
действительно не должен ничего знать о состоянии Lua.