2011-01-30 44 views
0

我想在類模板中使用memcpy。所以我的模板將被限制到C POD(結構)和char *的任何鏈接(並且可以在其他獨立類中聲明結構結構)。我希望任何類能夠訂閱它的功能(如果它有尊重的輸入參數)來投射事件。所以我的課,現在看起來像:如何讓我的C++類事件系統成爲一個僅限於一個數組類型的模板類?

class IGraphElement{ 
    typedef void FuncCharPtr(char*, int) ; 
public: 
    void Add(FuncCharPtr* f) 
    { 
     FuncVec.push_back(f); 
    } 
    void CastData(char * data, int length){ 
     for(size_t i = 0 ; i < FuncVec.size(); i++){ 
      char* dataCopy = new char[length]; 
      memcpy(dataCopy, data, length); 
      FuncVec[i](dataCopy, length); 
     } 
    } 
private: 
    vector<FuncCharPtr*> FuncVec ; 
}; 

一般來說,我想兩件事情是真的一個(我嘗試在僞代碼解釋):

template < typename GraphElementDatataStructurePtrType> 
class IGraphElement{ 
    typedef void FuncCharPtr(GraphElementDatataStructurePtrType, int) ; // here I want FuncCharPtr to be of type (AnyClassThatWantsToConnectToThisGraphElement::*)(GraphElementDatataStructurePtrType, int) 

public: 
    void Add(FuncCharPtr* f) 
    { 
     FuncVec.push_back(f); 
    } 

    void CastData(GraphElementDatataStructurePtrType data, int length){ 
     for(size_t i = 0 ; i < FuncVec.size(); i++){ 
      GraphElementDatataStructurePtrType dataCopy = new GraphElementDatataStructurePtrType[length]; 
      memcpy(dataCopy, data, length); 
      FuncVec[i](dataCopy, length); 
     } 
    } 

private: 
    vector<FuncCharPtr*> FuncVec ; 
    }; 

就是我想要的任何如何可能,如何實現它進入我的課堂? (對不起 - 我是一個C++ NUBE =()

+0

爲什麼要使用`memcpy`?爲什麼你使用`新字符[]`而不是`std :: vector `或`std :: string`,並且對於另一種類型的同上? – GManNickG 2011-01-30 07:54:52

+0

@GMan - 如果您可以提供任何可能使我的課程更好的代碼,我會很高興看到它。但我的觀點是複製指針內容並保留和分享訂閱者的指針。順便說一句,如果提升可以幫助我可以使用它... – Rella 2011-01-30 08:44:42

回答

1

你的問題已經由boost::signals庫解決
如果你有興趣在內部的工作,你可以嘗試使用boost::functionboost::bind庫來實現類似的東西
。 可以考證Modern C++ Design有關的仿函數模板的內部工作細節,或只是谷歌&問這個論壇

這裏有一個解決方案代碼草圖使用boost:

void DataCastHelper (boost::funtion funcCharPtr, char * data, int length) { 
    char* dataCopy = new char[length]; 
    memcpy(dataCopy, data, length); 

    funcCharPtr(dataCopy, length); 
} 

class IGraphElement { 
public: 
    void Add (FuncCharPt* f) { 
     funcVec.connect(boost::bind(&DataCastHelper, f, _1, _2)); 
    } 
    void CastData(char * data, int length){ 
     funcVec(data. length); 
    } 

private: 
    boost::signal<FuncCharPtr> funcVec; 
} 

FuncCharPt* f參數傳遞給IGraphElement::Add方法是堆疊與DataCastHelper做出應對數據爲你。該信號處理函數迭代和調用,並將參數傳遞給函子。

Regards

相關問題