首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使我的C++类事件系统成为一个限制为类型数组的模板类?

如何使我的C++类事件系统成为一个限制为类型数组的模板类?
EN

Stack Overflow用户
提问于 2011-01-30 15:49:50
回答 1查看 604关注 0票数 0

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

代码语言:javascript
运行
复制
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 ;
};

一般来说,我想要的是两件真正的事情(我试着用伪代码解释):

代码语言:javascript
运行
复制
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=()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-30 18:48:06

boost::signals库已经解决了您的问题。

如果您对内部工作原理感兴趣,可以尝试使用boost::functionboost::bind库实现类似的功能。

您可以研究Modern C++ Design以了解函数器模板的内部工作原理的详细信息,或者只需google&询问此论坛即可。

下面是一个使用boost的sketch解决方案代码:

代码语言:javascript
运行
复制
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堆叠在一起,以便为您复制数据。信号处理函数器的迭代和调用,并将参数传递给函数器。

问候

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4841792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档