解释 static_cast "static_cast<void (Pet::*)(int)>" 语法?

Interpreting static_cast "static_cast<void (Pet::*)(int)>" syntax?

我正在尝试理解 Pybind11 docs here 中使用的静态转换。具体来说,他们使用语法

static_cast<void (Pet::*)(int)>(&Pet::set)

因为在我努力解释并应用到我自己的代码之前我还没有见过这种语法,所以我希望有人能解释这里发生了什么。谢谢

编辑 - 一些上下文

我正在为具有两个签名的重载方法创建 Pybind11 绑定,仅 const 限定不同。我绑定的 class 是一个模板,所以我使用

    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;
        }

    ...

我在 post 中描述的辅助函数版本是这样的:

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))

getRowNames 行产生以下错误:

Address of overloaded function 'getRowNames' cannot be static_cast to type 'const std::vector<std::string> (ls::Matrix<complex<double>>::*)()'

对于阅读本文的任何其他人,由于答案我能够弄清楚的演员表是:

static_cast< std::vector<std::string>& (ls::Matrix<T>::*)()>(&Class::getRowNames)

含义:

static_cast<void (Pet::*)(int)>(&Pet::set)
  • static_cast<T_1>(T_2) 表示我们将类型 2 转换为类型 1。
  • T_1:
    • (Pet::*) 是指向 Petclass 成员的 指针 (请参阅 进一步讨论)
    • void (Pet::*)(int) 是一个指向成员函数的指针,它接受一个 int 参数,返回一个 void
  • T_2
    • &Pet::setPet::set
    • 的内存位置

所以基本上,我们明确声明我们正在 设置整数值

现在我们可以将set函数s绑定到python(允许我们设置年龄和姓名):

   .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");