2017-09-18 2 views
2

Ich habe eine C++ - Methode, die als x(const std::string &a, bool b=true) oder als x(const SomeClass &object, bool b=true) aufgerufen werden kann. In Python kann ich die SWIG Wrapper mit x('Hello', True) und x('Hello') und x(someObject, True) aufrufen.Typ Überprüfung und überladene Methoden in SWIG

Allerdings, wenn ich etwas wie x('Hi', 'Hello') swig versuchen konvertieren nicht 'Hallo' zu einem bool, so bekomme ich eine NotImplementedError: Wrong number or type of arguments for overloaded function.

Wie kann ich sagen, dass das zweite Argument in bool konvertieren soll, wenn vorhanden?

--- Aktualisierung ------------------------------------------ ------------

https://github.com/swig/swig/blob/master/CHANGES#L1527-L1581

der obige Link scheint das gewünschte Verhalten ist dies nun vorschlagen, obwohl es natürlich "kann mit einem typemap geändert werden ...?

+1

In Ihrem C++ Code würde der Aufruf von 'X (const std :: string &, bool)' mit 'x (" Hallo "," Hallo ")' funktionieren, weil * String-Literale * implizit in 'bool umwandelbar sind '. SWIG berücksichtigt dies nicht und sollte dies auch nicht tun. Fügen Sie eine korrekte Überladung von 'X (const std :: string &, const std :: string &)' 'hinzu und generieren Sie Ihre Bindungen erneut. – WhiZTiM

+0

Der Punkt ist, dass das zweite Argument in einem Python-Programm _anything_ sein darf, für das 'Wenn (b):' würde halten. Ich kann keine korrekte Überladung für jeden möglichen Typ hinzufügen! –

+2

Ich glaube ich verstehe dein Problem jetzt. Was ist mit dem Schreiben einer benutzerdefinierten "typemap" und der Anwendung auf diese spezifische Funktionssignatur? Oder [es erweitern] (https://stackoverflow.com/a/35257318/1621391) – WhiZTiM

Antwort

1

Am Ende fixiert ich es so (kann Folgen haben ...):

Die erste typemap sagt swig, dass alles in Python als bool behandelt werden kann. Die zweite Antwort von @ flexo konvertiert das übereinstimmende Argument in ein C++ - Bool.

2

Sie einen typemap für SWIG schreiben können, die Python-Object-Protokollfunktion PyObject_IsTrue für jede Eingabe wie folgt aufruft:

%module test 
%typemap(in) bool b "$1=PyObject_IsTrue($input);" 
void foobar(bool b=true); 
Verwandte Themen