lujw2 2 luni în urmă
comite
a2447caf7f

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+build/
+.cache/

+ 12 - 0
CMakeLists.txt

@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.18)
+project(demo)
+
+add_library(cam src/CameraImpl.cpp
+                ./src/detail/CameraConcept.hpp
+                ./src/devices/USBCamera.cpp)
+                # ./src/devices/NetworkCamera.cpp)
+# target_link_libraries(cam PRIVATE ${OpenCV_LIBS})
+target_include_directories(cam PUBLIC include)
+
+add_executable(demo ./test/main.cpp)
+target_link_libraries(demo PRIVATE cam)

+ 36 - 0
include/Camera.hpp

@@ -0,0 +1,36 @@
+#pragma once
+#include <memory>
+#include <functional>
+
+namespace camera {
+// 帧数据定义(示例)
+struct Frame {
+    void* data;
+    size_t width, height;
+};
+
+// 回调函数类型
+using FrameCallback = std::function<void(const Frame&)>;
+
+// 主相机接口(类型擦除包装类)
+class Camera {
+public:
+    // 构造函数(模板接受任意类型)
+    template <typename T>
+    explicit Camera(T&& impl);
+    ~Camera();
+
+    // 公共接口
+    void start();
+    void stop();
+    void set_callback(FrameCallback cb);
+
+    // 工厂函数(创建具体相机)
+    static Camera create_usb();
+    static Camera create_network(const std::string ip);
+
+private:
+    struct Impl; // 前向声明(PImpl 惯用法)
+    std::unique_ptr<Impl> pimpl;
+};
+} // namespace camera

+ 59 - 0
src/CameraImpl.cpp

@@ -0,0 +1,59 @@
+#include "Camera.hpp"
+#include "detail/CameraConcept.hpp"
+#include "devices/USBCamera.hpp"
+#include "devices/NetworkCamera.hpp"
+
+namespace camera {
+// class USBCamera;
+class NetworkCamera;
+
+// 实现前向声明的 Impl
+struct Camera::Impl {
+    std::unique_ptr<detail::CameraConcept> concept;
+};
+
+// 模板构造函数实现
+template <typename T>
+Camera::Camera(T&& impl) : pimpl(new Impl) {
+    pimpl->concept = std::make_unique<detail::CameraModel<T>>(std::forward<T>(impl));
+}
+
+Camera::~Camera() = default;
+
+// 显式实例化常用类型(可选)
+// template Camera::Camera(USBCamera&);
+// template Camera::Camera(NetworkCamera&);
+
+// 成员函数实现
+void Camera::start() { pimpl->concept->start(); }
+void Camera::stop() { pimpl->concept->stop(); }
+void Camera::set_callback(FrameCallback cb) { /*...*/ }
+
+// 工厂函数实现
+Camera Camera::create_usb() {
+    return Camera(USBCamera()); // 实际实现可能更复杂
+}
+//
+// 工厂函数实现
+Camera Camera::create_network(const std::string ip) {
+    return Camera(NetworkCamera(ip)); // 实际实现可能更复杂
+}
+
+namespace camera::detail {
+struct CameraConcept {
+    virtual ~CameraConcept() = default;
+    virtual void start() = 0;
+    virtual void stop() = 0;
+    virtual void set_callback(FrameCallback cb) = 0;
+};
+
+template <typename T>
+struct CameraModel : CameraConcept {
+    T impl;
+    explicit CameraModel(T&& obj) : impl(std::move(obj)) {}
+    void start() override { impl.start(); }
+    void stop() override { impl.stop(); }
+    void set_callback(FrameCallback cb) override { /*...*/ }
+};
+} // namespace camera::detail
+} // namespace camera

+ 19 - 0
src/detail/CameraConcept.hpp

@@ -0,0 +1,19 @@
+#include "Camera.hpp"
+
+namespace camera::detail {
+struct CameraConcept {
+    virtual ~CameraConcept() = default;
+    virtual void start() = 0;
+    virtual void stop() = 0;
+    virtual void set_callback(FrameCallback cb) = 0;
+};
+
+template <typename T>
+struct CameraModel : CameraConcept {
+    T impl;
+    explicit CameraModel(T&& obj) : impl(std::move(obj)) {}
+    void start() override { impl.start(); }
+    void stop() override { impl.stop(); }
+    void set_callback(FrameCallback cb) override { /*...*/ }
+};
+} // namespace camera::detail

+ 13 - 0
src/devices/NetworkCamera.hpp

@@ -0,0 +1,13 @@
+#include <cstdio>
+#include <string>
+namespace camera {
+class NetworkCamera {
+public:
+    NetworkCamera(const std::string ip) { printf("Creating Net camera\n"); }
+    void start() { printf("Starting Net camera\n"); }
+    void stop() { printf("Stop Net camera\n"); }
+    // 私有成员无需暴露
+private:
+    std::string ip_;
+};
+} // namespace camera

+ 6 - 0
src/devices/USBCamera.cpp

@@ -0,0 +1,6 @@
+#include "USBCamera.hpp"
+namespace camera {
+USBCamera::USBCamera() {};
+void USBCamera::start() { printf("Starting USB camera\n"); }
+void USBCamera::stop() { printf("Stop USB camera\n"); }
+} // namespace camera

+ 12 - 0
src/devices/USBCamera.hpp

@@ -0,0 +1,12 @@
+#include <cstdio>
+namespace camera {
+class USBCamera {
+public:
+  USBCamera();
+  void start();
+  void stop();
+  // 私有成员无需暴露
+private:
+  int fd; // 例如:文件描述符
+};
+} // namespace camera

+ 19 - 0
test/main.cpp

@@ -0,0 +1,19 @@
+#include "Camera.hpp"
+#include <string>
+
+int main() {
+    // 通过工厂函数创建相机
+    auto cam1 = camera::Camera::create_usb();
+    auto cam2 = camera::Camera::create_network("192.168.1.100");
+
+    // // 直接传递自定义类型(需实现接口)
+    // struct MyCamera {
+    //     void start() { /*...*/ }
+    //     void stop() { /*...*/ }
+    // };
+    // camera::Camera cam3(MyCamera{});
+
+    // 统一操作
+    cam1.start();
+    cam2.stop();
+}