C++ 如何制作我的C++;类事件系统是一个仅限于一个类型数组的模板类吗?

C++ 如何制作我的C++;类事件系统是一个仅限于一个类型数组的模板类吗?,c++,oop,events,templates,types,C++,Oop,Events,Templates,Types,我想在类模板中使用memcpy。所以我的模板将被限制为指向C POD(结构)和char*(当然,结构可以在其他独立类中声明)的任何链接。我希望任何类都能够订阅它的函数(如果它有值得尊重的输入参数)来强制转换事件。所以我的课现在看起来像: class IGraphElement{ typedef void FuncCharPtr(char*, int) ; public: void Add(FuncCharPtr* f) { FuncVec.push_bac

我想在类模板中使用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 ;
};
类元素{
typedef void funcharptr(字符*,int);
公众:
无效添加(FuncCharPtr*f)
{
功能推回(f);
}
void CastData(字符*数据,整数长度){
对于(size_t i=0;i
一般来说,我想要两件真正合二为一的东西(我试着用伪代码解释):

template
类元素{
typedef void FuncCharPtr(GraphelementDataTastStructurePtrType,int);//这里我希望FuncCharPtr的类型为(希望连接到该GrapherElement的任何类::*)(GraphelementDataTastStructurePtrType,int)
公众:
无效添加(FuncCharPtr*f)
{
功能推回(f);
}
void CastData(GraphelementDataTastStructurePtrType数据,整数长度){
对于(size_t i=0;i

我想要的东西有多可能,如何在我的课堂上实现?(对不起,我是C++ Nube =)(

> p>您的问题已经得到了库的解决。 如果您对内部工作感兴趣,可以尝试使用和库实现类似的功能。
你可以研究functor模板的内部工作细节,或者只需谷歌搜索并询问这个论坛

下面是使用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;
}
void DataCastHelper(boost::Function funcCharPtr,char*data,int-length){
char*dataCopy=新字符[长度];
memcpy(数据拷贝、数据、长度);
funcCharPtr(数据拷贝,长度);
}
类元素{
公众:
无效添加(funcharpt*f){
functvec.connect(boost::bind(&DataCastHelper,f,_1,_2));
}
void CastData(字符*数据,整数长度){
funcVec(数据长度);
}
私人:
boost::信号函数;
}
传递给
IGraphElement::Add
方法的
FuncCharPt*f
参数是堆叠的,使用DataCastHelper为您进行数据处理。该信号处理函数的迭代和调用,并将参数传递给函数


关于

为什么要使用
memcpy
?为什么要使用
newchar[]
而不是
std::vector
std::string
,其他类型也一样?@GMan-如果你能提供任何可能使我的类更好的代码,我很乐意看到它。但我这里的重点是复制指针内容,并保留和共享指向订阅者的指针。顺便说一句,如果boost可以帮助我,我可以使用它…嗨,pl请再澄清一点。据我所知,您希望完成两项任务:1)为任何可调用的实体构建一个容器2)使用提供的参数从此容器中调用每个实体。我说的对吗?请注意,使用boost::bind几乎可以将任何东西插入信号。示例:不,信号对我不起作用(请参阅),所以您可以提供任何关于如何做我需要的事情的实用代码,或者提供一些关于如何做这些事情的特定书籍上的任何特定页面吗?我添加了一个简短的代码草图,描述基于信号和函数的解决方案。如果你在“抓住它”方面有问题,你可能应该进一步调查函子的用法。我提到的Alexandrescu的书应该是一个很好的开始。funcCharPtr typedef会是什么样子?funcCharPtr应该与您的信号模板专用化类型相对应。所以它应该是boost::function或类似的东西。
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;
}