我想知道如何为重载函数创建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 *)
我应该如何纠正我的类型图以使其正常工作?
答案 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