Interpretieren der Syntax static_cast "static_cast <void (Pet :: *) (int)>"?

Nov 01 2020

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

3 CasperDijkstra Nov 01 2020 at 21:05

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 einen intParameter akzeptiert und a zurückgibtvoid
  • T_2
    • &Pet::set ist der Speicherort von Pet::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");