Użyłem pomyślnie SWIG do zbudowania interfejsu otoki, aby moje biblioteki C++ były dostępne w C#. Ostatnio wyeksponowałem obiekty o wartości boost::optional<>
, a SWIG ma z nimi problemy. Czy istnieje standardowy sposób radzenia sobie z tym? Ktoś musiał już na tym poprzestać ...Czy możesz zwiększyć SWIG :: opcjonalne <>?
Odpowiedz
Ponieważ SWIG nie rozumie typów doładowań, muszą być zapisane mapy typów. Oto para mapowań dla boost::optional<int>
.
Z pythonowa None
lub całkowita może być przekazywane do funkcji:
%typemap(in) boost::optional<int> %{
if($input == Py_None)
$1 = boost::optional<int>();
else
$1 = boost::optional<int>(PyLong_AsLong($input));
%}
zwrócony boost::optional<int>
zostaną przekształcone do zerem albo liczbą całkowitą Pythonie
%typemap(out) boost::optional<int> %{
if($1)
$result = PyLong_FromLong(*$1);
else
{
$result = Py_None;
Py_INCREF(Py_None);
}
%}
Dzięki! Będę musiał dostosować go do C# zamiast Pythona, ale to nie powinno stanowić problemu. – aldo
Ups, całkowicie przegapiłeś swój tag C#, ale powinna to być niewielka zmiana. –
możliwe rozwiązanie C# używając std :: wektor
#if SWIGCSHARP
// C++
%typemap(ctype) boost::optional<int32_t> "void *"
%typemap(out) boost::optional<int32_t> %{
std::vector<int32_t> result_vec;
if (!!$1)
{
result_vec = std::vector<int32_t>(1, $1.get());
}
else
{
result_vec = std::vector<int32_t>();
}
$result = new std::vector<uint32_t>((const std::vector<uint32_t> &)result_vec);
%}
// C#
%typemap(imtype) boost::optional<int32_t> "global::System.IntPtr"
%typemap(cstype) boost::optional<int32_t> "int?"
%typemap(csout, excode=SWIGEXCODE) boost::optional<int32_t> {
SWIG_IntVector ret = new SWIG_IntVector($imcall, true);$excode
if (ret.Count > 1) {
throw new System.Exception("Return vector contains more then one element");
}
else if (ret.Count == 1) {
return ret[0];
}
else {
return null;
}
}
#endif //SWIGCSHARP
- 1. Czy możesz mieć wiele linii w elemencie <option>?
- 2. Czy możesz mieć <span> w ramach <span>?
- 3. Czy możesz zdefiniować <=> w Ruby, a następnie mieć ==,>, <, > = i <= zdefiniowane automatycznie?
- 4. Jak uzyskać pierwszy pusty Opcjonalnie <T> z listy Opcjonalne <T>
- 5. Czy możesz zwiększyć siłę wibratora na urządzeniach z Androidem?
- 6. Jak zwiększyć obszar klikalny przycisku znacznika <a>?
- 7. Dlaczego warto zwiększyć :: assign :: list_of nie działa z parą <string, vector <string>>?
- 8. <%# %> vs <%= %>
- 9. IList <int> vs Lista <int>
- 10. Czy można zwiększyć :: lexical_cast <std::string> (Int_Type) kiedykolwiek rzucić?
- 11. SortedList <>, SortedDictionary <> i Dictionary <>
- 12. convert <vector><string> TO <vector><int> C++, Win32
- 13. ASP.NET <%= %> vs <%: %>
- 14. Czy możesz tworzyć znaki nowej linii \ n wyświetlać jako przerwy <br />?
- 15. Różnice między .CreateObjectSet <T>,. Ustaw <T> i .CreateQuery <T>?
- 16. Czy std :: experimental :: optional <> odniesienie do pomocy technicznej?
- 17. Operator clojure -> (strzałka) i operacje opcjonalne
- 18. IEnumerable <> to IList <>
- 19. Szyny ERB <%- ... -%> vs. <% ... %>
- 20. Wyświetlanie <<..>> = na wyjściu
- 21. <?> vs <T>
- 22. Jak udostępnić Boost :: shared_ptr <T> do pliku interfejsu Tcl + SWIG?
- 23. # <UserSession: {: unauthorized_record => "<protected>"}>
- 24. W jaki sposób SWIG zawija mapę <string, string> w języku Python?
- 25. Czy <algorithm> definiuje makro X?
- 26. Czy <? rozszerza ...> wyłączność parametrów metody?
- 27. Czy specjalizacja szablonów wymaga szablonu <>?
- 28. Czy znacznik <tr> jest opcjonalny?
- 29. GWT czy istnieje widżet <label>?
- 30. Jaka jest różnica między robi wektor <vector<T...>> i grafika <vector<T> ...>
Czy to nie jest szersze pytanie o to, jak SWIG radzi sobie z dowcipem h szablony? Nie używałem SWIG, ale szybkie skanowanie sugeruje, że mogą istnieć pewne ograniczenia szablonów. – dotcomslashnet
@dotcomslashnet Tak i nie. SWIG można skonfigurować, aby dostosować sposób, w jaki tłumaczy/owija wszystko. Miałem nadzieję, że zarówno SWIG, jak i 'boost :: optional <>' są powszechnie używane, że ktoś już to zrobił, więc nie muszę ponownie wymyślać koła. :-) – aldo