Как передать static_cast указатель на функцию-член const?

#c #constants #member-function-pointers #pybind11

Вопрос:

Удивительно (смущающе?) Я не могу правильно понять синтаксис static_const const функции-члена. Короче говоря (подробности ниже), если функция-член не отмечена const Я использую:

 static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar)
 

но помечая функцию-член Foo::bar(...) const , компилятор не знает, что делать:

 error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;)'
 

Куда я должен поместить значение функции? const

Подробные сведения

Я пытаюсь создать привязку Python для следующего модуля:

 namespace mymodule {

class Foo
{
public:

    Foo() = defau<

    template <class T>
    T bar(const Tamp; a) const
    {
        T ret = a;
        for (autoamp; i : ret) {
            i *= 2.0;
        }
        return ret;
    }

    template <class T>
    T bar(const Tamp; a, double f) const
    {
        T ret = a;
        for (autoamp; i : ret) {
            i *= f;
        }
        return ret;
    }

};

} // namespace mymodule
 

в результате чего я пишу привязки Python с помощью pybind11:

 #include <pybind11/pybind11.h>

namespace py = pybind11;

PYBIND11_MODULE(example, m)
{
    py::class_<mymodule::Foo>(m, "Foo")
        .def(py::init<>())

        .def("bar",
             static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar),
             py::arg("a"))

        .def("bar",
             static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;, double)>(amp;mymodule::Foo::bar),
             py::arg("a"),
             py::arg("f"));
}
 

который не удается скомпилировать:

 .../example.cpp:54:14: error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;)'
             static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar),
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../example.cpp:19:7: note: candidate function template
    T bar(const Tamp; a) const
      ^
.../example.cpp:29:7: note: candidate function template
    T bar(const Tamp; a, double f) const
      ^
.../example.cpp:58:14: error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;, double)'
             static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;, double)>(amp;mymodule::Foo::bar),
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../example.cpp:19:7: note: candidate function template
    T bar(const Tamp; a) const
      ^
.../example.cpp:29:7: note: candidate function template
    T bar(const Tamp; a, double f) const
      ^
2 errors generated.
 

Ответ №1:

Вы должны добавить const , наконец, как:

 static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;) const>(amp;mymodule::Foo::bar),
//                                                                             ^^^^^
 

Комментарии:

1. Спасибо!! Я все еще нахожу этот синтаксис время от времени сбивающим с толку.