во-первых, я мог бы обернуть свою функцию C ++, которая использует мой собственный тип строки. Вот как я это сделал.
Это моя функция C ++.
static void my_func(t_string message) {
do_something(message.c_str());
}
И это карта типов SWIG.
%typemap(in) (t_string message)
{
if (!lua_isstring(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: string expected");
}
$1 = lua_tostring(L, 1);
}
Хотя это, кажется, работает нормально, интересно, можно ли обернуть my_func(t_string &message)
или же my_func(const t_string &message)
,
Я спрашиваю об этом потому, что я думаю, что передача строки по ссылке будет немного быстрее, чем передача по значению, поскольку я могу избежать ненужного копирования строки.
Пожалуйста, дайте мне знать, если я ошибаюсь по этому поводу.
Впереди одно: я не думаю, что стоит переходить по ссылке к дополнительному значению производительности, потому что в общей производительности, вероятно, будет преобладать преобразование между типами интерпретатора и типами C ++. Более того, вы можете фактически не получить никакой производительности благодаря современной семантике перемещения, ср. Дни прохождения const std :: string & как параметр окончен?
SWIG лечит ссылки как указатели и инициализирует их nullptr
, Это означает, что вы должны new
вверх строку, сохранить ее в аргументе и определить дополнительный freearg
наберите карту, чтобы снова избавиться от выделенной памяти.
%module references
%{
#include <iostream>
#include <string>
using t_string = std::string;
static void my_func(const t_string &message) {
std::cout << message << '\n';
}
%}
%include "exception.i"
%typemap(in) (const t_string &message)
{
if (!lua_isstring(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: string expected");
}
$1 = new t_string{lua_tostring(L, 1)};
}
%typemap(freearg) (const t_string &message)
{
delete $1;
}
void my_func(const t_string &message);
Других решений пока нет …