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++ 代码的一个热门选择。
posted @ 2024-08-22 11:21  玥茹苟  阅读(87)  评论(0编辑  收藏  举报