为C ++重载函数创建SWIG类型图

时间:2018-08-02 06:49:43

标签: c++ lua swig

我想知道如何为重载函数创建SWIG类型图。

MyBindings.h

static void test(t_string *s)
{
    std::cout << "first : " << s->name << '\n');
}

static void test(t_string *s, t_string *s2)
{
    std::cout << "first : " << s->name << '\n');
    std::cout << "second : " << s2->name << '\n');
}

MyBindings.i

%module my
%{
    #include "MyBindings.h"
%}

%include <stl.i>
%include <exception.i>
%include <typemaps.i>
/* convert the input lua_String to t_string* */
%typemap(in) t_string*
{
    if (!lua_isstring(L, $input))
        SWIG_exception(SWIG_RuntimeError, "argument mismatch: string expected");
    $1 = makestring(lua_tostring(L, $input));
}

如果我在Lua中打test()

my.test("abc", "def");

我收到以下错误:

Wrong arguments for overloaded function 'test'
  Possible C/C++ prototypes are:
    test(t_string *)
    test(t_string *,t_string *)

我应该如何纠正我的类型图以使其正常工作?

1 个答案:

答案 0 :(得分:1)

这是RTFM的典型情况。参见11.5.2 "typecheck" typemap

  

如果您定义新的“ in”类型映射,并且您的程序使用重载方法,则还应该定义“ typecheck”类型映射的集合。有关详细信息,请参见Typemaps and overloading部分。

和您的问题一样,头文件中缺少警卫。我只是制作了自己的t_string.h,因为我不知道它来自哪里。函数test不能是静态的,因为毕竟您想从此翻译单元之外引用它们,而当它们具有internal linkage时是不可能的。

MyBindings.h

#pragma once
#include <iostream>
#include "t_string.h"

void test(t_string *s)
{
    std::cout << "first : " << s->name << '\n';
}

void test(t_string *s, t_string *s2)
{
    std::cout << "first : " << s->name << '\n';
    std::cout << "second : " << s2->name << '\n';
}

MyBindings.i

%module my
%{
    #include "MyBindings.h"
%}

/* convert the input lua_String to t_string* */
%typemap(typecheck) t_string* {
    $1 = lua_isstring(L, $input);
}
%typemap(in) t_string* {
    $1 = makestring(lua_tostring(L, $input));
}
%typemap(freearg) t_string* {
    freestring($1);
}
%include "MyBindings.h"

test.lua

local my = require("my")
my.test("abc", "def")

示例调用:

$ swig -c++ -lua MyBindings.i
$ clang++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.2 -shared -fPIC MyBindings_wrap.cxx -o my.so -llua5.2
$ lua5.2 test.lua
first : abc
second : def