Я пытаюсь получить доступ к членам файла C ++ из типа, который я определил в скрипте. Проблема в том, что Boxed_Value::get_attr
всегда возвращать нулевое значение.
Вот мой файл C ++:
#include <chaiscript/chaiscript.hpp>
#include <iostream>
int main()
{
chaiscript::ChaiScript chai;
chaiscript::Boxed_Value test_value = chai.eval_file("script.chai");
chaiscript::Boxed_Value number = test_value.get_attr("number");
std::cout << chaiscript::boxed_cast<int>(number) << std::endl;
}
А также script.chai:
class MyType
{
attr number
def MyType
{
this.number = 30
}
}
MyType()
Я ожидал это напечатать 30, но вместо этого он бросил bad_boxed_cast
исключение. Во время моего инвестирования я обнаружил, что number.is_null()
правда.
Я явно сделал что-то не так, но не могу найти свою ошибку.
Или, может быть, он не предназначен для использования таким образом?
Boxed_Value::get_attr
предназначен для внутреннего использования (мне действительно нужно документировать это. Теперь запомните это). Его можно использовать для применения атрибутов к любой тип объекта. Это не атрибуты, которые можно искать по имени в ChaiScript с помощью .name
нотации.
Функция, которую вы хотите chaiscript::dispatch::Dynamic_Object::get_attr()
, Dynamic_Object
тип C ++, который реализует определенные объекты ChaiScript
Чтобы получить к нему доступ, вы хотите:
int main()
{
chaiscript::ChaiScript chai;
const chaiscript::dispatch::Dynamic_Object &test_value = chai.eval_file<const chaiscript::dispatch::Dynamic_Object &>("script.chai");
chaiscript::Boxed_Value number = test_value.get_attr("number");
std::cout << chaiscript::boxed_cast<int>(number) << std::endl;
}
Вы также можете позвонить test_value.get_attrs()
чтобы получить полный набор именованных атрибутов на объекте.
Не ответ, но я добавил кучу отладок;
chaiscript::Boxed_Value test_value = chai.eval_file("script.chai");
auto info = test_value.get_type_info();
printf("%d\n", info.is_const());
printf("%d\n", info.is_reference());
printf("%d\n", info.is_void());
printf("%d\n", info.is_arithmetic());
printf("%d\n", info.is_undef());
printf("%d\n", info.is_pointer());
printf("%s\n", info.name().c_str());
printf("%s\n", info.bare_name().c_str());
и получил:
0
0
0
0
0
0
N10chaiscript8dispatch14Dynamic_ObjectE
N10chaiscript8dispatch14Dynamic_ObjectE