我想在类模板中使用 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/