1. 程式人生 > >嘗試新思路——CError的另一種實現方式

嘗試新思路——CError的另一種實現方式

程式碼如下:

#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表示式等等。