尝试新思路——CError的另一种实现方式
来源:互联网 发布:网络视频产业发展趋势 编辑:程序博客网 时间:2024/05/19 00:38
代码如下:
#ifndef __MYERROR_H__#define __MYERROR_H__#include "Error.h"#include <map>#include <functional>template<typename... Args>class CErrors{private: std::map<int, std::function<int(Args...)> > _calls;public: virtual ~CErrors() { _calls.clear(); } void Add(int index, std::function<int(Args...)> fct) { _calls.insert(std::make_pair(index, fct)); } template<typename Object> void Add(int index, Object* object, int (Object::*method)(Args...)) { _calls.insert(std::make_pair(index, [object, method](Args... args)->int{ return (*object.*method)(args...); })); } template<typename Object> void Add(int index, Object* object, int (Object::*method)(Args...) const) { _calls.insert(std::make_pair(index, [object, method](Args... args)->int{ return (*object.*method)(args...); })); } template<typename Object> void Add(int index, const Object* object, int (Object::*method)(Args...) const) { _calls.insert(std::make_pair(index, [object, method](Args... args)->int{ return (*object.*method)(args...); })); } void Remove(int index) { _calls.erase(index); } int OnError(int index, Args... args) { if (_calls.find(index) == _calls.end()) return -1; return _calls[index](args...); }};class CMyError : public LinWin::CError{public: virtual int OnError(int level) { return m_errors.OnError(0, level); } virtual int OnError(int code, int level) { return m_errors.OnError(code, level); }public: CErrors<int> m_errors;};#endif
我想试着把所有错误统一处理,CError因此而来。我把错误分为两类,调用系统函数出错和自定义错误。调用系统函数出错,统一以索引0来自动调用处理函数。自定义的错误就以错误码code来自动调用处理函数。
在类CMyError中,真正去处理错误的是一个模板类,这个模板类的实现,使用C++11标准中的std::function和lambda表达式。这样我们就可以把所有的形式的函数添加到模板类中,包括全局函数,成员函数,仿函数或者lambda表达式等等。
0 0
- 尝试新思路——CError的另一种实现方式
- 尝试新思路——CError和CExit
- 尝试新思路——CError、CExit和CNetworkEvent的一种实现
- 尝试新思路——Select模型的另一种实现
- Decorator的另一种实现方式
- 代理的另一种实现方式
- 尝试新思路——网络事件类CNetworkEvent
- 尝试新思路——跨平台Select模型
- List的的另一种实现方法的尝试
- 对反射的思考——另一种抽象,另一种实现
- Android ListView优化的另一种实现方式
- 看板,敏捷的另一种实现方式
- 另一种校验同步报文的实现方式
- TabLayout:另一种Tab的实现方式
- TabLayout:另一种Tab的实现方式
- TabLayout:另一种Tab的实现方式
- TabLayout:另一种Tab的实现方式
- C++浅拷贝的另一种实现方式
- 复杂链表的复制
- C#进程间使用同步EVENT事件
- iOS通知观察者的添加和移除
- TextInputLayout的学习和应用
- java.net.BindException: Address already in use解决方法
- 尝试新思路——CError的另一种实现方式
- Ubuntu16.04安装jdk1.8(tar.gz方式)
- React Router 使用教程
- java高级程序设计笔记(8章 BOM)
- 【Android - 基础】之Dialog分类及使用
- HTML学习之概述
- python onvif module
- sql server 事务和锁
- java-接口