2009-10-01 2 views
2

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

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

+0

Что вы ожидаете на выходе вместо «номер» - вы ожидаете, «возраст»? –

+0

Я пытаюсь получить тип данных, так что «num_years» или «num_years *». Я уже могу получить имена переменных. – zslayton

ответ

3

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

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

0

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

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

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