Как сделать мою систему событий класса C ++ классом шаблона, ограниченным массивом типов? - PullRequest
0 голосов
/ 30 января 2011

Я хочу использовать memcpy в шаблоне класса. Таким образом, мой шаблон будет ограничен любой ссылкой на C POD (структуру) и char * (и конечно же структуры могут быть объявлены в других независимых классах). Я хочу, чтобы любой класс мог подписать свою функцию (если он имеет уважительные аргументы ввода) для приведения события. Итак, мой класс теперь выглядит так:

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 = ()

1 Ответ

1 голос
/ 30 января 2011

Ваша проблема была решена библиотекой boost :: сигналов .
Если вы заинтересованы во внутренней работе, вы можете попробовать реализовать нечто подобное, используя boost :: function ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] * * * * * * *

.

Вот код решения sketch с использованием 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, равен stacked с DataCastHelper для созданияданные справляются для вас.Сигнал обрабатывает итерацию и вызов функторов, а также передает аргументы функторам.

Regards

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...