Как создать карту типов SWIG для функций, которые возвращают определенный тип

Я пытаюсь создать карту типов 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?

0

Решение

Это немного сложно. После отправки результата в стек вы также должны увеличить количество возвращаемых значений, которые хранятся в 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())
1

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

Других решений пока нет …

По вопросам рекламы [email protected]