[C++-sig] std::complex vs python complex
Jim Bosch
talljimbo at gmail.com
Tue Apr 10 17:37:55 CEST 2012
On 04/10/2012 06:58 AM, Holger Brandsmeier wrote:
> Dear list,
>
> I exported a wrapper for std::complex<double> to python and I am
> willing to always use this class in python and I never want to use
> pythons own `complex` data type.
>
> However, a funny thing happens when I export the addition operator
> (the implemenation is given in the STL ...)
> .def(self + self)
>
> Now I get that:
> type(scalar_cd(1,2) + scalar_cd(1,2))
> <type 'complex'>
>
> But my own type is of the form:
> type(scalar_cd(1,2))
> <class 'parfem.scalarPy.scalar_cd'>
>
>
> Why did this happen and how can I avoid this? Later own I get problems
> when I want to pass this back to C++.
>
> I remember that pythons own complex type is a bit special and does not
> cooperate nicely with boost::python and std::complex<> but how did
> python/boost::python end up converting the result of the addition to
> `complex`?
>
> I am using:
> Python 2.7.2
> boost-1.46.1
>
Does your custom complex type provide implicit conversion to std::complex?
If so, I'm guessing there's something going wrong with overload
resolution; Boost.Python's operator wrappers simply invoke the C++
operators and lookup the Python conversion based on the result type.
You can test this yourself with something like this:
--------------------------------------------------------------------
// use any namespace other than the one your classes are defined in
namespace {
template <typename T> void test_expr(T const & x) {
std::cerr << typeid(x).name() << std::endl;
}
} // <anonymous>
int main() {
test_expr(whatever::scalar_cd(1,2) + whatever::scalar_cd(1,2));
return 0;
}
--------------------------------------------------------------------
If the output you see when running the above is std::complex, you'll
have a test case that doesn't involve Boost.Python you can use to debug
your overload resolution. If not, let me know, and I'll dig deeper into
what Boost.Python's doing.
HTH!
Jim
More information about the Cplusplus-sig
mailing list