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