如何在swig_lua_class中访问基类/父类列表

我注意到在生成的 SWIG 包装器中,针对一组类,SWIG 会保留该类从中继承的所有父类的 C-字符串表示形式的列表(char ** base_names)。我知道有一个函数 swig_type(some_variable),它将返回给定变量的数据类型的字符串表示形式。还有一个函数能够返回父类名称的字符串表吗?如果没有的话,有没有一种容易编写这个函数的方式?我对 SWIG 的内部工作一窍不通。谢谢!

原文链接 https://stackoverflow.com/questions/911632

点赞
stackoverflow用户62569
stackoverflow用户62569

下面的代码应该可以工作(未经测试,因为我不使用 SWIG 与 Lua):

// 插入到运行时部分
// 这是迭代 base_names 数组的 C 函数
// (我假定该数组以 NULL 结尾)
%runtime %{
    /* 获取 userdata 类型的 Lua 可调用函数 */
    SWIGRUNTIME int SWIG_Lua_basenames(lua_State* L)
    {
      swig_lua_userdata* usr;
      swig_lua_class* clss = NULL;
      int i = 0;
      if (lua_isuserdata(L,1))
      {
        usr=(swig_lua_userdata*)lua_touserdata(L,1);  /* 获取数据 */
        if (usr && usr->type && usr->type->clientdata) {
          // 获取 swig_lua_class 结构体,其中包含 base_names
          clss = (swig_lua_class*)usr->type->clientdata;
        }
      }
      /* 创建一个包含所有类基类名称的新表
         注意,即使 clss 为 NULL,我也要创建它,
         这样应该会返回一个空表
      */
      lua_newtable(L);
      while(clss && clss->base_names[i]) {
         lua_pushnumber(L, i+1); /* lua 表从 1 开始 */
         lua_pushstring(L, clss->base_names[i]);
         lua_rawset(L, -3);
         i++;
      }
      return 1;
    }
%}
%init %{
  /* 这将进入用户初始化函数,将我们的新函数注册到 Lua 运行时 */
  SWIG_Lua_add_function(L,"swig_base_names",SWIG_Lua_basenames);
%}
2009-05-26 17:11:32