pybind11 && c++类封装(第一篇)
c++类封装
在Python中使用C++类,我们可以使用pybind11库来封装C++类。以下是一个简单的示例,演示了如何在Python中使用一个简单的C++类: #include <pybind11/pybind11.h> class MyClass { public: MyClass(int value) : m_value(value) {} int getValue() const { return m_value; } void setValue(int value) { m_value = value; } private: int m_value; }; namespace py = pybind11; PYBIND11_MODULE(my_module, m) { py::class_<MyClass>(m, "MyClass") .def(py::init<int>()) .def("get_value", &MyClass::getValue) .def("set_value", &MyClass::setValue); } 在上面的示例中,我们定义了一个简单的C++类MyClass,它包含一个整数成员变量和两个成员函数getValue和setValue。然后,我们使用pybind11库来将这个类封装为一个Python模块my_module,并在Python中使用它。
在Python中,我们可以这样使用这个封装过的C++类:
import my_module # 创建一个 MyClass 实例 obj = my_module.MyClass(42) # 调用成员函数 print(obj.get_value()) # 输出: 42 obj.set_value(100) print(obj.get_value()) # 输出: 100 通过这种方法,我们可以在Python中使用C++类,并直接调用其成员函数。这种方法对于将现有的C++代码集成到Python中非常有用,同时也提供了更高效的性能。
pybind11&&C++类型互通
pybind11 是一个非常强大的工具,能够将 C++ 代码与 Python 交互。它可以识别和封装许多 C++ 类型,使得这些类型能够在 Python 中使用。以下是一些 pybind11 能够处理的主要 C++ 类型及其相关功能: 1. 基本数据类型 整型:int, unsigned int, long, unsigned long, long long, unsigned long long 浮点型:float, double 布尔型:bool 字符型:char, wchar_t 2. 字符串和 STL 容器 C风格字符串:const char* 可以直接转换为 str。 std::string:可以与 Python 的字符串类型互相转换。 std::vector<T>:可以与 Python 的列表互通。 std::set<T>:可以与 Python 的集合互通。 std::map<K, V>:可以与 Python 字典类型互通。 std::tuple:可以与 Python 的元组类型互通。 std::array:可以与 Python 的列表互通(有限大小的数组)。 3. 自定义类型和类 类和结构体:自定义的类和结构体可以通过 pybind11 包装暴露给 Python,包括成员变量和方法。你需要显式地使用 py::class_ 来进行封装。 4. 智能指针和其他复杂类型 std::shared_ptr 和 std::unique_ptr:可以与 Python 的对象管理机制结合使用。 std::optional<T>:可以封装可选类型,转换为 Python 的 None 或者相应类型。 std::variant:封装变体类型,可以与 Python 的联合类型进行交互。 5. 函数和 lambda 表达式 可以将 C++ 函数和 lambda 表达式直接暴露给 Python。 6. 其他类型 函数指针:可以传递函数指针到 Python。 枚举:可以将 C++ 枚举封装为 Python 的枚举类型。 示例代码 以下是一个简单的示例,展示了 pybind11 如何封装多种类型: #include <pybind11/pybind11.h> #include <vector> #include <string> #include <map> #include <set> namespace py = pybind11; class MyClass { public: MyClass(int x) : value(x) {} int get_value() const { return value; } void set_value(int x) { value = x; } std::vector<int> get_vector() const { return {1, 2, 3, 4, 5}; } std::string get_greeting(const std::string& name) const { return "Hello, " + name; } private: int value; }; PYBIND11_MODULE(example, m) { py::class_<MyClass>(m, "MyClass") .def(py::init<int>()) .def("get_value", &MyClass::get_value) .def("set_value", &MyClass::set_value) .def("get_vector", &MyClass::get_vector) .def("get_greeting", &MyClass::get_greeting); }
总结
pybind11 可以识别和封装多种 C++ 类型,允许你将 C++ 的强类型系统高效地映射到 Python 的动态类型系统。这种兼容性使得 pybind11 成为在 Python 中调用 C++ 代码的一个热门选择。