Как получить доступ к членам типа, определенного в скрипте?

Я пытаюсь получить доступ к членам файла 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() правда.
Я явно сделал что-то не так, но не могу найти свою ошибку.
Или, может быть, он не предназначен для использования таким образом?

3

Решение

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() чтобы получить полный набор именованных атрибутов на объекте.

3

Другие решения

Не ответ, но я добавил кучу отладок;

  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
1