c++ - 如何使我的 C++ 类事件系统成为限于类型数组的模板类?

标签 c++ oop events templates types

我想在类模板中使用 memcpy。所以我的模板将仅限于任何指向 C POD(结构)和 char* 的链接(当然,结构可以在其他独立类中声明)。我希望任何类都能够订阅它的函数(如果它有尊重的输入参数)来转换事件。所以我的类(class)现在看起来像:

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 ;
};

通常我想要 2 个真正相同的东西(我尝试用伪代码解释):

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 ; 
  };

我想要的东西有多大可能以及如何将其实现到我的类(class)中? (抱歉 - 我是 C++ nube=()

最佳答案

您的问题已由 boost::signals 解决图书馆。
如果您对内部工作原理感兴趣,可以尝试使用 boost::function 实现类似的东西。和 boost::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;
}

传递给 IGraphElement::Add 方法的 FuncCharPt* f 参数与 DataCastHelper 一起堆叠,为您制作数据拷贝。信号处理仿函数迭代和调用,并将参数传递给仿函数。

问候

关于c++ - 如何使我的 C++ 类事件系统成为限于类型数组的模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4841792/

相关文章:

c++ - 在 boost::lambda 中使用 boost::format

c++ - template<typename T> using L = T(*)(T); 中的 (*) 是什么意思?

c++ - 释放指针意味着我不能将指针用作 *p?

oop - 如何将一个类的 itcl 对象传递给另一个类的对象并使用所传递对象的功能?

javascript - 这个在JS中的用法?

events - 何时使用事件跟踪以及何时对 AJAX 调用使用页面浏览跟踪

jQuery 和 Vimeo Froogaloop API

iphone - 如何使用不同角度的弹弓移动物体?

PHPdoc:记录可链接的方法?

Javascript 文本输入更改处理程序与 div 单击处理程序相结合