嘗試新思路——CError的另一種實現方式
阿新 • • 發佈:2019-01-28
程式碼如下:
#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表示式等等。