<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Feb 18, 2015 at 5:13 PM, Christopher O'Grady <span dir="ltr"><<a href="mailto:cpo@slac.stanford.edu" target="_blank">cpo@slac.stanford.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
Hi,<br>
<br>
Based on websearches we have done, we believe that boost-python does<br>
not allow passing arguments by non-const-reference (at least, not<br>
easily).  Can someone confirm this is still the case, or point me to<br>
some documentation that discusses it?  We think this prevents us from<br>
return multiple arguments from a method call.<br>
<br>
Looking through the mailing list archives, we believe this is<br>
impossible.  If someone knows differently can you let us know?<br>
<br></blockquote><div><br></div><div>Passing Boost.Python-wrapped C++ classes wrapped by non-const-reference works just fine.  What doesn't work is passing immutable Python primitive types by non-const-reference (e.g. numeric types, str).  The reason is that Python itself doesn't support output arguments, so it's actually impossible to change the value of, say, an integer, when it's passed to a wrapped function, and the assumption is that any C++ function that takes a non-const-reference does indeed intend to modify that argument, and hence that shouldn't be allowed.<br></div><div><br></div><div>Note that this is a Python limitation, not a Boost.Python one - any wrapper generator library will have a problem with this case, though it may not be the same problem.  While Boost.Python refuses to wrap such code, others may allow it but generate incorrect wrappers that don't modify the output argument in Python.</div><div><br></div><div>The solution is to modify these interfaces to return output arguments in a tuple, as in the example Stefan just provided.</div><div><br></div><div>Jim</div><div><br></div><div><br></div></div></div></div>