Re: Conversion of Python list to class that takes a vector in a constructor
William S Fulton <[email protected]> Wed, 27 Oct 2021 19:18:14 +0100
| Newsgroups | gmane.comp.programming.swig |
|---|---|
| Message-ID | <CANGqftBzZ_HN__VuE+5S+cG+m+AuB4kdxS04rAsmRELqWpoiHg@mail.gmail.com> |
Take a look at %implicitconv mentioned in the CHANGES file http://swig.org/Release/CHANGES I think this should work: %implicitconv S; William On Mon, 25 Oct 2021 at 13:30, Lluís Alemany Puig <[email protected]> wrote: > Hello all, > > I have a C++ class S which takes a std::vector<int> as only input > parameter in one of its constructors. I can create an object of S > normally from Python using its constructor passing to it a python list ( > [1,2,3,...]). However, I can't call the function calculate_sum (which > takes a const S&) when I pass to it a python list instead an object of > type S. To be more precise, in the following python code, the print("3:", > ...) > > import library > print("1:", library.return_pair(10)) > d = library.D() > d.v = 3 > print("2:", library.calculate_sum(d, library.S([1,2,3,4]))) > print("3:", library.calculate_sum(d, [1,2,3,4])) > > fails with the expected error message: > > Traceback (most recent call last): > File "test.py", line 6, in <module> > print(library.calculate_sum(d, [1,2,3,4])) > File "library.py", line 261, in calculate_sum > return _library.calculate_sum(d, s) > TypeError: in method 'calculate_sum', argument 2 of type 'S const &' > > I'm trying to overcome this problem. That is, I would like python to > create an object of type S given that it has a constructor with a vector > (C++ code at the end). Can this be done? If so, how? I tried typemaps but I > don't seem to be able to get them working for this. > > Many thanks in advance. > > Looking forward to hearing from you, > > Lluís. > > C++ code: > > #pragma once > #include <vector> > class D { > public: > int v; > }; > > class S { > public: > S() noexcept = default; > S(const std::vector<int>& _v) noexcept : v(_v) {} > int elemsum() const noexcept { > int s = 0; > for (int k : v) { s += k; } > return s; > } > private: > std::vector<int> v; > }; > > int calculate_sum(const D& d, const S& s) { return s.elemsum() + d.v; } > std::pair<int, S> return_pair(int v) { > S s(std::vector<int>(v,v)); > return {s.elemsum(), s}; > } > > Interface file (.i): > > %module library > > %include stdint.i > %include std_string.i > %include std_pair.i > %include std_vector.i > > %template(_list_int) std::vector<int>; > > %{ > #include <sstream> > #include "library.hpp" > %} > > %include library.hpp > > %extend S { > std::string __repr__() const { > std::ostringstream out; > out << "I am a simple 'S'"; > return out.str(); > } > } > > %template(_pair_int_S) std::pair<int, S>; > > Makefile: > > _library.so: library.o > g++ -shared -O3 -o _library.so library.o -L /usr/lib/x86_64-linux-gnu/ > -lpython3.8 > library.o: library.cxx > g++ -fPIC -std=c++17 -O3 -c library.cxx -I /usr/include/python3.8 > library.cxx: library.i library.hpp > swig -Wall -debug-tmused -c++ -python -py3 -o library.cxx library.i > clean: > rm -f library.cxx > rm -f library.py > rm -f library.o > rm -f _library.so > > _______________________________________________ > Swig-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/swig-user > _______________________________________________ Swig-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/swig-user