Interpretieren der Syntax static_cast "static_cast <void (Pet :: *) (int)>"?
Ich versuche, die statische Besetzung zu verstehen, wie sie in den Pybind11-Dokumenten hier verwendet wird . Insbesondere verwenden sie die Syntax
static_cast<void (Pet::*)(int)>(&Pet::set)
Da ich diese Syntax noch nicht gesehen habe, bevor ich mich bemühe, meinen eigenen Code zu interpretieren und anzuwenden, hoffte ich, dass jemand erklären könnte, was hier vor sich geht. Vielen Dank
Bearbeiten - ein Kontext
Ich erstelle Pybind11-Bindungen für eine überladene Methode mit zwei Signaturen, die sich nur durch die constQualifikation unterscheiden. Die Klasse, die ich binde, ist eine Vorlage, daher verwende ich diese Strategie, um die Bindungen zu erstellen
template<class T>
class Matrix {
public:
...
/**
* get the row names
*/
std::vector<std::string> &getRowNames() {
return rowNames;
}
/**
* get the row names (mutable)
*/
const std::vector<std::string> &getRowNames() {
return rowNames;
}
...
Meine Version der in diesem Beitrag beschriebenen Hilfsfunktion lautet wie folgt:
template<typename T>
void declare_matrix(py::module &m, const std::string &typestr) {
using Class = ls::Matrix<T>;
const std::string &pyclass_name = typestr;
py::class_<Class>(m, pyclass_name.c_str(), py::buffer_protocol(), py::dynamic_attr())
.def(py::init<unsigned int, unsigned int>())
.def("getRowNames", static_cast<const std::vector<std::string>(ls::Matrix<T>::*)()>(&ls::Matrix<T>::getRowNames))
Die getRowNamesZeile erzeugt jedoch den folgenden Fehler:
Address of overloaded function 'getRowNames' cannot be static_cast to type 'const std::vector<std::string> (ls::Matrix<complex<double>>::*)()'
Für alle anderen, die dies lesen, war die Besetzung, die ich dank der Antwort herausfinden konnte, folgende:
static_cast< std::vector<std::string>& (ls::Matrix<T>::*)()>(&Class::getRowNames)
Antworten
Die Bedeutung von:
static_cast<void (Pet::*)(int)>(&Pet::set)
static_cast<T_1>(T_2)bedeutet, dass wir Typ 2 auf Typ 1 umwandeln.T_1::(Pet::*)ist ein Zeiger auf ein Klassenmitglied von Pet (siehehttps://stackoverflow.com/a/9939367/14344821 für eine weitere Diskussion)void (Pet::*)(int)ist ein Zeiger auf eine Elementfunktion, die einenintParameter akzeptiert und a zurückgibtvoid
T_2&Pet::setist der Speicherort vonPet::set
Grundsätzlich geben wir ausdrücklich an, dass wir den ganzzahligen Wert festlegen .
Jetzt können wir die setFunktion s an Python binden (so können wir sowohl Alter als auch Name festlegen):
.def("set", static_cast<void (Pet::*)(int)>(&Pet::set), "Set the pet's age")
.def("set", static_cast<void (Pet::*)(const std::string &)>(&Pet::set), "Set the pet's name");