未知模板类的函数指针
Function pointer for an unknown template class
我在这里用头撞墙...我不确定如何措辞这个问题的标题,因为我不确定如何为此找到解决方案。
我有一个基模板类(组件(,其中包含每个组件类型(如位置、方向、网格(的所有实例的映射。我在制定一个"迭代"函数时遇到问题,该函数将遍历地图并为每个实例调用一个 void 成员函数(作为迭代函数的参数提供(。我很确定我应该使用函数指针,但我在网上找到的所有示例都是针对全局函数或非模板类的。
下面是基模板类
typedef unsigned long uuid;
template <class T>
class Component {
public:
static std::map<uuid, T*> IDS;
static typename std::map<uuid, T*>::iterator Iterator;
static T* Create(uuid fID) {
Component<T>::IDS[fID] = new T(fID);
return Component<T>::IDS[fID];
};
static void Iterate(); //how do I add in void function pointers?
static bool ifExists(uuid fID);
};
template <typename T>
std::map<uuid, T*> Component<T>::IDS;
template <typename T>
typename std::map<uuid, T*>::iterator Component<T>::Iterator;
template <typename T>
void Component<T>::Iterate() {
for(Iterator = IDS.begin(); Iterator != IDS.end(); Iterator++) {
//This references the instance that performs the given function
//(*Iterator).second
}
}
下面是与模板一起使用的组件的示例。
class COM_Position {
float x, y, z;
public:
COM_Position(uuid fID);
uuid ID;
void Set(float fX, float fY, float fZ);
void Display();
};
COM_Position::COM_Position(uuid fID) : ID(fID) {
x = 0; y = 0; z = 0;
}
void COM_Position::Display() {
printf("%lu : (%f, %f, %f)", ID, x, y, z);
}
typedef Component<COM_Position> Position;
我将如何创建一个迭代函数,该函数将函数指针作为可应用于每个实例的参数(例如,为每个实例调用 Display(?我希望能够做这样的事情。
int main() {
for(int ii = 0; ii < 4; ii++) {
Position::Create(ii);
}
/*
This is what I am aiming for; a clean iterator function
Position::Iterate(Display());
*/
}
如果这是不可能的,我知道我可以用宏来模拟它......
像这样的东西?
template <typename T>
void Component<T>::Iterate(void (T::*method)() ) {
for(Iterator i= IDS.begin(); i != IDS.end(); i++) {
(i->second->*method)();
}
}
并迭代:
Position::Iterate( &COM_Position::Display );
<小时 />编辑:一些neet重载:
使用 C++0x 的可变参数模板,您可以使用一些通用方法。我没有测试它,但它看起来很有希望:
template <typename T, typename... Args>
void Component<T>::Iterate(void (T::*method)(Args... args), Args&&... params) {
for(Iterator i= IDS.begin(); i != IDS.end(); i++) {
(i->second->*method)(std::forward<Args>(params)...);
}
}
大多数函数和函子可以与以下功能一起使用:
template <typename T, typename F>
void Component<T>::Iterate( F func ) { // using generic functor
for(Iterator i= IDS.begin(); i != IDS.end(); i++) {
func(i->second->*method);
}
}
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针