代码之家  ›  专栏  ›  技术社区  ›  Vahagn

SWIG支持静态成员函数的继承

  •  4
  • Vahagn  · 技术社区  · 14 年前

    SWIG不包装派生类的继承静态函数。如何解决?

    这里有一个简单的问题说明。

    这是一个简单的C++头文件:

    // file test.hpp
    #include <iostream>
    
    class B
    {
    public:
      static void stat()
      { std::cerr << "=== calling static function B::stat" << std::endl; }
    
      void nonstat() const
      { std::cerr << "==== calling B::nonstat for some object of B" << std::endl; }
    };
    
    class D : public B {};
    

    C++源文件只包含头文件:

    // file test.cpp
    #include "test.hpp"
    

    SWIG接口文件只包含C++头文件:

    // file test.swig
    %module test
    %{
    #include "test.hpp"
    %}
    
    %include "test.hpp"
    

    然后我通过以下方法生成swig包装器代码:

    swig -c++ -tcl8 -namespace main.swig
    

    然后我创建了一个共享库:

    g++ -fpic -Wall -pedantic -fno-strict-aliasing \
                   test.cpp test_wrap.cxx -o libtest.so
    

    因此,在tcl解释程序中加载libtest.So并尝试使用包装的接口时,它具有以下行为:

    % load libtest.so test
    % test::B b
    % test::D d
    % b nonstat    # works fine
    % d nonstat    # works fine
    % test::B_stat # works fine
    % test::D_stat # DOESN'T WORK !!
    

    所以问题是我怎样才能使SWIG包装D::stat?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Petriborg    14 年前

    静态函数仅在父级中定义 class B 对的?如所示:

    D::stat();
    

    不可调用对吗?这就是为什么SWIG没有包装函数。。。

    至于如何访问函数,SWIG允许您从任何想要的类中添加/隐藏/包装函数,因此可以“修复”SWIG类以授予对 stat() .

    相信语法是这样的:

    %extend D {
       ...
    }
    

    我已经有一段时间没碰过雨刷了,所以我可能记错了什么。