我正在尝试使用模板将用 Java 编写的代码重写为 C++。这是一个例子。
代码如下所示:
class IBookUpdatedHandler {
public:
virtual ~IBookUpdatedHandler() {}
virtual void updateBook(int bookIndex)=0;
};
class IBookFiredHandler {
public:
virtual ~IBookUpdatedHandler() {}
virtual void fireBook(int bookIndex)=0;
};
template <typename T>
class Dispatcher {
private:
list<T> listeners;
const char* methodName;
public:
Dispatcher(const char* name) {
this->methodName = name;
}
void add(T listener) {
listeners.push_back(listener);
}
void dispatch() {
// listeners loop
for(typename list<T>::iterator pos = listeners.begin(); pos != listeners.end(); pos++)
{
// i don't know what is in the box .. (list<T>)..
// call ..
// listener could have (*pos)->do_somethig() ?
}
}
};
Dispatcher<IBookUpdatedHandler*> *dispatcher = new Dispatcher<IBookUpdatedHandler*>("updateBook");
Dispatcher<IBookFiredHandler*> *dispatcher = new Dispatcher<IBookFiredHandler*>("fireBook");
我想在 dispatch()
函数中调用 updateBook
或 fireBook
但是,在 C++ 中,我认为没有办法知道类型名称中的内容。
是否有与 Java 的 getMethod
等效的 C++?
最佳答案
您不能像在 Java 中那样在运行时选择函数。你可以使用 dynamic_cast<>
确定对象的类型,然后调用适当的函数。
我认为更好的解决方案是让两个类共享相同的功能:
class IBookGenericHandler {
public:
virtual void genericBook(int bookIndex)=0;
};
class IBookUpdatedHandler:public IBookGenericHandler {
public:
virtual ~IBookUpdatedHandler() {}
virtual void updateBook(int bookIndex)=0;
virtual void genericBook(int bookIndex) { updateBook(bookIndex) }
};
class IBookFiredHandler:public IBookGenericHandler {
public:
virtual ~IBookUpdatedHandler() {}
virtual void fireBook(int bookIndex)=0;
virtual void genericBook(int bookIndex) { fireBook(bookIndex) }
};
然后你可以调用genericBook
在你的for
循环,它负责处理需要调用这两个函数中的哪一个。
关于java - 有什么办法可以知道C++模板中的函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244045/