尝试新思路——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
原创粉丝点击