如何在SWIG中包装使用引用自定义类型的C ++函数?

时间:2018-06-15 10:11:39

标签: c++ lua swig typemaps

首先,我可以包装使用我的自定义字符串类型的C ++函数。我就是这样做的。

这是我的C ++功能。

MasiniShTable.php

这是SWIG类型图。

static void my_func(t_string message) {
    do_something(message.c_str());
}

虽然这看似很好,但我想知道是否可以包裹%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)

我问这个的原因是因为我认为通过引用传递字符串会比传递值快一点,因为我可以避免不必要地复制字符串。

如果我错了,请告诉我。

1 个答案:

答案 0 :(得分:1)

未来还有一件事:我认为通过引用传递额外的性能是值得的,因为整体性能可能会受到解释器类型和C ++类型之间转换的支配。此外,由于今天的移动语义,你实际上可能无法获得任何性能,参见Are the days of passing const std::string & as a parameter over?

SWIG会对references as pointers进行处理并将其初始化为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);