SWIG / Lua: определить тип данных поля члена - PullRequest
2 голосов
/ 01 октября 2009

SWIG любезно предоставляет функцию swig_type () для получения строкового представления типа данных переданного объекта пользовательских данных. Однако в случае полей-членов SWIG и Lua считают, что они являются простыми «числовыми» элементами, и поэтому печатают только «число» вместо имени типа данных.

, например

typedef num_years int;

class Person
{
    public:
           Person * spouse;
           num_years   age;
};

в C ++ приведет к:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

> p = MyModule.Person();
> print(swig_type(p.spouse));
Person *
> print(swig_type(p.age));
number

Есть ли какой-нибудь секретный маршрут, который я мог бы выбрать, чтобы определить типы данных полей членов? Я вижу, что функции get и set имеют правильное строковое представление числовых полей при проверке аргументов.

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 08 октября 2009

Объекты C ++ в оболочке SWIG - это объекты пользовательских данных Lua, соответствующие определенному набору правил. swig_type() работает, вглядываясь в эти объекты пользовательских данных и извлекая информацию имени типа, хранящуюся там SWIG. Но age представлен непосредственно, поэтому нет поля с именем типа, которое нужно искать, поэтому swig_type() не может творить чудеса. Вы можете получить то, что вы хотите, сделав num_years непрозрачным типом класса, который заключает в себе int (и который, возможно, определяет некоторые неявные преобразования для простоты использования в C ++), но это большая работа, чтобы получить сомнительное вознаграждение.

Функции get и set работают по совершенно другому механизму; они имеют правильную подпись, потому что SWIG сохраняет ее в сгенерированной оболочке во время компиляции, копируя из файла интерфейса.

0 голосов
/ 04 августа 2016

Я знаю, что это очень старый, но я полагаю, что я добавлю возможный ответ.

Оберните годы в структуру как:

struct year_t
{
    year_t(int year) : m_year(year) {}
    void operator()(int year) { m_year = year; }
    int operator()() const { return m_year; } 
private:
    int m_year;
}

class Person
{
public:
       Person * spouse;
       year_t age;
};
...