Я пытаюсь создать карту типов SWIG для функций, которые возвращают определенный тип.
Например, это моя функция C ++
t_float get()
{
return 3.14159;
}
t_float
определяется либо float
или же double
в зависимости от #define
установка на один заголовочный файл. И, похоже, SWIG i
файл не может прочитать определенные символы в этом файле, даже если я включаю заголовок в i
файл.
Итак, я решил создать карту типов для этой функции так t_float
тип может быть преобразован в lua_number
,
Но я понятия не имею, как создать карту типов для функций, которые возвращают значение.
Я пытался сделать это сам, но не смог.
%typemap(out) t_float
{
lua_pushnumber(L, (lua_Number)($output));
}
Как правильно создать карту типов, чтобы я мог сделать get()
вернуть числовое значение в Lua?
Это немного сложно. После отправки результата в стек вы также должны увеличить количество возвращаемых значений, которые хранятся в SWIG_arg
, Я узнал об этом только после того, как взглянул на внутренние карты типов SWIG. (Идентификатор называется $output
не существует)
N.B .: Пожалуйста, немедленно отбросьте привычку явно приводить значения к желаемому типу. Это опасно, потому что, если тип не совпадает, вы говорите компилятору «все равно интерпретировать этот битовый шаблон как желаемый тип, Я знаю, что я делаю». Просто позвольте компилятору сделать неявное преобразование за вас. Вы также получите ошибку компилятора, если типы не конвертируемы, что намного лучше, чем ошибка сегментации или значения мусора во время выполнения. Видеть это Wandbox ссылка для демонстрации и обратите внимание, что нет никаких предупреждений компилятора!
%module t_float
%{
typedef double t_float;
t_float get() {
return 3.14159;
}
%}
%include <typemaps.i>
%typemap(out) t_float {
lua_pushnumber(L, $1);
++SWIG_arg;
}
t_float get();
local t_float = require("t_float")
print(t_float.get())
Других решений пока нет …