使用 Swig 将 std::set 转换为 ruby

Convert std::set to ruby with Swig

我正在使用 Swig 在 ruby 中使用 C++,目前我已经完成了一个简单的文件示例 david.h

#include <stdio.h>
class David
{
public:
    David(int x)
    {
        this->x = x;
    }
    void announce()
    {
        printf("David %d\n", x);
    }
    int x;
};

还有一个像这样的 swig 文件

%module "david"
%{
#include <libdavid.h>
%}
class David
{
public:
    David(int x);
    void announce();
    int x;
};

我的 extconf.rb 看起来像这样

require 'mkmf'
system('swig -c++ -ruby libdavid.i') or abort
create_makefile('david')

这有助于我在 ruby 中执行一个非常简单的示例,例如

2.2.1 :001 > a=David::David.new(42)
 => #<David::David:0x000000022c3ec0 @__swigtype__="_p_David"> 
2.2.1 :002 > a.x
 => 42 

现在我已经非常努力地尝试了一段时间,但我就是想不出如何使用示例 here 中给出的 c++ stl 中的集合。 如果有人能帮助我解决如何创建一组 stl 整数或矢量并展示如何插入和擦除方法在该 set/vector 上工作,那将是非常好的。简单的代码示例不仅对我很有用,而且对许多将来可能会遇到这种情况的人也很有用。


这只是个人要求,如果您很忙,请跳过此部分。
老实说,我使用堆栈溢出已经有一段时间了,但慢慢地我开始对社区感到失望。我已经发布了几个问题,但没有收到满意的答案,没有赞成票,没有反对票,什么都没有,我只是没有收到任何答案。令我惊讶的是,可以通过简单的 google 搜索来回答的极其琐碎的问题通常非常受欢迎,而来自新用户的重要问题要么被严重否决,要么被完全忽略。我明白社区不欠我任何东西。但如果有人能解释可能的原因,我将不胜感激。

谢谢

这还不完整,但可以作为有用的参考。我找不到合适的文档,但它工作正常。 将此添加到 swig 文件

%include <std_set.i>
namespace std {
   %template(IntSet) set<int>;
}

现在运行 extconf.rb 现在 ruby

支持以下 set 命令
2.2.1 :001 > a=David::IntSet.new
 => std::set<int,std::less< int >,std::allocator< int > > [] 
2.2.1 :002 > a.push(4)
 => 4 
2.2.1 :003 > a.push(1)
 => 1 
2.2.1 :004 > a.push(123)
 => 123 
2.2.1 :005 > a.push(612)
 => 612 
2.2.1 :006 > a
 => std::set<int,std::less< int >,std::allocator< int > > [1,4,123,612] 
2.2.1 :007 > a[0]
 => 1 
2.2.1 :008 > a.erase(a.begin)
 => nil 
2.2.1 :009 > a
 => std::set<int,std::less< int >,std::allocator< int > > [4,123,612] 
2.2.1 :010 > a[0]
 => 4 
2.2.1 :011 > a[1]
 => 123 
2.2.1 :012 > a.erase(a.begin)
 => nil 
2.2.1 :013 > a
 => std::set<int,std::less< int >,std::allocator< int > > [123,612] 

我仍然不清楚 push 如何像 insert for set 那样工作,但它确实有效。 但是这个例子清楚地展示了如何使用 set。向量可以使用类似的方法。

这个答案当然不完整,欢迎 answers/comments 有经验的用户回答。