2016-05-05 27 views
6

Używam Swig używać C++ w Ruby i Obecnie mam zrobić prosty przykład pliku david.hKonwersja std :: set do Ruby z Swig

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

a inny plik dla łykiem jak ten

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

My extconf.rb wygląda to

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

To pomaga mi wykonać bardzo prosty przykład w rubin jak ten

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

Teraz staram bardzo trudno na chwilę teraz, ale ja po prostu nie może dowiedzieć się, jak korzystać z C++ ustawić STL, jak podano w przykładzie here. Byłoby naprawdę miło, gdyby ktoś mógł mi pomóc, w jaki sposób mógłbym stworzyć zbiór liczb całkowitych lub być wektorowym i pokazać jak wstawiać i usuwać metody działające na tym zbiorze/wektorze. Proste próbki kodu byłyby bardzo użyteczne nie tylko dla mnie, ale dla wielu osób, które mogą w przyszłości stawić temu czoła.


To tylko osobiste życzenie. Pomiń to, jeśli jesteś zajęty.
Szczerze mówiąc od pewnego czasu używam przepełnienia stosu, ale powoli zaczynam się rozczarowywać społecznością. Zadawałem kilka pytań i nie otrzymałem satysfakcjonujących odpowiedzi, Żadnych głosów up-głosów, żadnych głosowań w dół, nic, po prostu nie otrzymałem żadnych odpowiedzi. Zaskakuje mnie to, że niezwykle banalne pytania, na które można odpowiedzieć w prostym wyszukiwaniu w Google, są często bardzo popularne, a ważne pytania od nowych użytkowników są albo mocno odrzucane, albo całkowicie ignorowane. Rozumiem, że społeczność niczego mi nie robi. Byłbym jednak bardzo wdzięczny, gdyby ktoś mógł wyjaśnić możliwe przyczyny takiego stanu rzeczy.

Dzięki

Odpowiedz

1

To nie jest kompletne, ale może służyć jako przydatne odniesienie. Nie mogłem znaleźć odpowiedniej dokumentacji, ale działa dobrze. Dodaj to do haust plikowi

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

Teraz uruchom extconf.rb A teraz następujące polecenia do zestawu są obsługiwane w Ruby

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] 

Jak Push działa jak wkładka do zestawu nie jest jeszcze jasne, mnie, ale działa. Ale ten przykład wyraźnie pokazuje, w jaki sposób można użyć zestawu. Podobne podejście można zastosować w przypadku wektora.

Ta odpowiedź z pewnością nie jest kompletna, a odpowiedzi/komentarze od doświadczonych użytkowników są mile widziane.

+0

Przeszukanie [dokumentacji SWIG] (http://www.swig.org/Doc3.0/SWIGDocumentation.html) dla "STL" natychmiast ujawnia sekcję zatytułowaną [Biblioteka STL/C++] (http: // www. swig.org/Doc3.0/SWIGDocumentation.html#Library_stl_cpp_library). Myślę, że to zasadniczo odpowiada na twoje pytanie. – m7thon

+0

Przykład bardzo podobny do twojego można znaleźć w sekcji [Ruby STL] (http://www.swig.org/Doc3.0/Ruby.html#Ruby_C_STL_Functors) dokumentacji SWIG. – m7thon