news 2026/4/19 0:11:41

动态代理C++

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态代理C++

有时候需要计算函数延迟, 这个时候可以做一个代理 :

before 进行 开始计数, after计数结束并计算延迟,这个时候就可以使用代理类

可以实现一个TimerProxy代理类, Invoke函数可以执行你想要计算延迟的函数, 然后在 Invoke前后加入 before 和after函数,
#pragma once #include <iostream> #include <functional> #include <string> #include <tuple> #include <memory> #include <chrono> #include <thread> inline const char* gnu_demangle(const char* raw) { while (*raw >= '0' && *raw <= '9') ++raw; // 跳过长度前缀 return raw; } inline const char* pretty_name(const char* raw) { #ifdef _MSC_VER const char* p = strrchr(raw, ' '); return p ? p + 1 : raw; // MSVC: "class Foo" → "Foo" #else // GCC/Clang return gnu_demangle(raw); // "3Foo" → "Foo" #endif } template<typename RealObject> class TimerProxy { private: std::shared_ptr<RealObject> objectPtr_; std::chrono::high_resolution_clock::time_point t1; std::chrono::high_resolution_clock::time_point t2; long long m_delay =0; public: // ✅ 完美转发构造函数 template<typename... Args> explicit TimerProxy(Args&&... args) : objectPtr_(std::make_shared<RealObject>(std::forward<Args>(args)...)) { std::string name = pretty_name(typeid(RealObject).name()); std::cout<<"name:"<< name<<std::endl; } // ✅ 从现有shared_ptr构造 explicit TimerProxy(std::shared_ptr<RealObject> ptr) : objectPtr_(std::move(ptr)) { std::string name =typeid(RealObject).name(); std::cout<<"name:"<< name<<std::endl; } void before(){ t1 = std::chrono::high_resolution_clock::now(); std::cout<<"before-------------"<<std::endl; } template<typename Func, typename... Args> decltype(auto) Invoke(Func&& func, Args&&... args) { std::cout << "Ultimate Invoke Use count: " << objectPtr_.use_count() << "\n"; before(); auto f= std::invoke( std::forward<Func>(func), *objectPtr_, // 解引用智能指针 std::forward<Args>(args)... ); after(); return f; } void after(){ t2 = std::chrono::high_resolution_clock::now(); m_delay = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); std::cout << "after----delay: " <<m_delay << "\n"; } long long delay() const { return m_delay; } // ✅ C++17 兼容:延迟调用 - 使用 std::tuple 代替包扩展 template<typename Func, typename... Args> auto Defer(Func&& func, Args&&... args) { std::cout << "Deferring call (C++17 compatible)\n"; // ✅ C++17 方案:使用 std::tuple 保存参数 auto tupleArgs = std::make_tuple(std::forward<Args>(args)...); // ✅ 返回延迟执行的可调用对象 return [this, func = std::forward<Func>(func), argsTuple = std::move(tupleArgs)]() mutable -> decltype(auto) { std::cout << "Executing deferred call...\n"; // ✅ 使用 std::apply 展开元组参数 return std::apply( [this, &func](auto&&... unpackedArgs) -> decltype(auto) { return std::invoke(func, *objectPtr_, std::forward<decltype(unpackedArgs)>(unpackedArgs)...); }, std::move(argsTuple) ); }; } // ✅ 条件调用:根据谓词决定是否执行 template<typename Pred, typename Func, typename... Args> decltype(auto) InvokeIf(Pred&& predicate, Func&& func, Args&&... args) { if (std::invoke(std::forward<Pred>(predicate))) { std::cout << "Condition true - invoking\n"; return std::invoke( std::forward<Func>(func), *objectPtr_, std::forward<Args>(args)... ); } else { std::cout << "Condition false - skipping\n"; // 返回默认值 using ReturnType = std::invoke_result_t<Func, RealObject&, Args...>; if constexpr (!std::is_void_v<ReturnType>) { return ReturnType{}; } } } // ✅ 批量调用:一次性执行多个操作 template<typename... Actions> void Batch(Actions&&... actions) { std::cout << "Batch execution\n"; // 使用折叠表达式执行所有操作 ((std::cout << "Executing action...\n", std::invoke(std::forward<Actions>(actions), *objectPtr_)), ...); } std::shared_ptr<RealObject> GetSharedPtr() const { return objectPtr_; } RealObject& Get() { return *objectPtr_; } const RealObject& Get() const { return *objectPtr_; } }; #ifdef _WIN32 #include <windows.h> #include <mmsystem.h> #pragma comment(lib, "winmm.lib") #endif class TestService { private: int operationCount_ = 0; public: explicit TestService() {} int ComplexOperation(int x, const std::string& op, double factor) { ++operationCount_; std::cout <<__func__ << op << " " << x << " * " << factor << "\n"; #ifdef _WIN32 timeBeginPeriod(1); Sleep(100); timeEndPeriod(1); #else std::this_thread::sleep_for(std::chrono::milliseconds(100)); #endif return static_cast<int>(x * factor); } std::string GetServiceInfo() const { return " GetServiceInfo: " + std::to_string(operationCount_); } void ResetCounter() { operationCount_ = 0; std::cout << "ResetCounter\n"; } bool IsHealthy() const { return operationCount_ > 1000; } }; int main() { TimerProxy<TestService> proxy; // ✅ 基本调用 int result1 = proxy.Invoke(&TestService::ComplexOperation, 42, std::string("Processing"), 1.5); std::cout << "Result: " << result1 << "\n\n"; // ✅ C++17 兼容的延迟调用 auto deferred = proxy.Defer(&TestService::ComplexOperation, 00, std::string("Deferred"), 2.5); std::cout << "============2=====\n"; int result2 = deferred(); std::cout << "Deferred result: " << result2 << "\n\n"; // ✅ 条件调用 int result3 = proxy.InvokeIf( [&proxy]() { return proxy.Get().IsHealthy(); }, &TestService::ComplexOperation, 200, std::string("Conditional"), 1.8 ); std::cout << "Conditional result: " << result3 << "\n\n"; // ✅ 批量调用 proxy.Batch( [](TestService& svc) { svc.ResetCounter(); }, [](TestService& svc) { svc.ComplexOperation(50, "Batch1", 1.1); } ); // ✅ 获取服务信息 std::string info = proxy.Invoke(&TestService::GetServiceInfo); std::cout << "GetServiceInfo: " << info << "\n"; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 23:48:51

高安全场景怎么设阈值?CAM++专业级配置建议

高安全场景怎么设阈值&#xff1f;CAM专业级配置建议 在银行柜台身份核验、金融远程开户、政务线上认证等关键业务中&#xff0c;说话人识别系统不是“能用就行”&#xff0c;而是必须“万无一失”。一个看似微小的阈值设置偏差&#xff0c;可能让攻击者用录音回放绕过验证&am…

作者头像 李华
网站建设 2026/4/18 7:33:48

美胸-年美-造相Z-Turbo生产稳定性:7×24小时连续运行无OOM故障实测15天

美胸-年美-造相Z-Turbo生产稳定性实测&#xff1a;724小时连续运行15天零OOM故障 1. 镜像定位与核心价值 美胸-年美-造相Z-Turbo 是一款面向特定风格图像生成需求的轻量化文生图模型镜像&#xff0c;它并非通用型大模型&#xff0c;而是聚焦于稳定、高效、可长期部署的垂直场…

作者头像 李华
网站建设 2026/4/18 8:46:51

AI原生应用:提升用户体验的必知要点

AI原生应用&#xff1a;提升用户体验的必知要点 关键词&#xff1a;AI原生应用、用户体验、上下文感知、持续学习、自然交互、预测性服务、多模态交互 摘要&#xff1a;当手机里的天气APP不再只显示“明天晴天”&#xff0c;而是主动提醒你“明早8点送孩子上学时&#xff0c;记…

作者头像 李华
网站建设 2026/4/18 20:12:02

Chord视频理解工具多场景落地:视频内容分析+目标时空定位双引擎

Chord视频理解工具多场景落地&#xff1a;视频内容分析目标时空定位双引擎 1. 什么是Chord&#xff1f;一个真正能“看懂”视频的本地智能分析工具 你有没有遇到过这样的问题&#xff1a;手头有一段监控录像&#xff0c;想快速知道里面有没有人闯入&#xff1b;或者剪辑了一段…

作者头像 李华
网站建设 2026/4/18 11:25:14

保姆级教程:Qwen2.5-7B-Instruct环境配置与功能体验

保姆级教程&#xff1a;Qwen2.5-7B-Instruct环境配置与功能体验 1. 为什么你需要这个7B旗舰模型——不是所有大模型都叫“专业级” 你有没有遇到过这些情况&#xff1f; 写技术方案时卡在逻辑闭环上&#xff0c;反复修改三遍还是不够严谨&#xff1b; 调试Python脚本花了两小…

作者头像 李华
网站建设 2026/4/13 21:34:43

RMBG-2.0效果实测:不同品牌手机拍摄的人像图发丝分割一致性分析

RMBG-2.0效果实测&#xff1a;不同品牌手机拍摄的人像图发丝分割一致性分析 1. 为什么这次实测聚焦“发丝一致性”&#xff1f; 人像抠图最怕什么&#xff1f;不是背景没去掉&#xff0c;而是发丝边缘毛躁、断连、半透明区域丢失——尤其当用户用手机随手拍一张照片就上传时&…

作者头像 李华