代码如下:
#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表达式等等。