有没有办法知道C++模板中的函数类型
Is there any way to know what kind of function is in the template in C++?
我正在尝试使用模板重写用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++中,我认为没有办法知道类型名称中的内容。
有没有C++相当于Java的getMethod
?
您不能像在 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) }
};
然后,您可以在for
循环中调用genericBook
,它会处理需要调用这两个函数中的哪一个。
如果您使用的是最新标准(C++11,以前称为 C++0x)的功能,我建议您使用 lambda 表达式和广义函数指针:
template <typename T>
class Dispatcher {
private:
std::list<T> listeners;
std::function<void(T)> caller;
public:
Dispatcher(function<void(T)> caller) : caller(caller) {}
void add(T listener) {
listeners.push_back(listener);
}
void dispatch() {
// listeners loop
for(typename std::list<T>::iterator pos = listeners.begin(); pos != listeners.end(); pos++)
{
caller(*pos);
}
}
};
Dispatcher<IBookUpdatedHandler*> *dispatcher1 = new Dispatcher<IBookUpdatedHandler*>(
[](IBookUpdatedHandler* p) { p->updateBook(0); }
);
Dispatcher<IBookFiredHandler*> *dispatcher2 = new Dispatcher<IBookFiredHandler*>(
[](IBookFiredHandler* p) { p->fireBook(0); }
);
如果您无法使用 C++11,那么您可以使用 Boost::function 代替,但它会不太清楚。
作为旁注,在大多数情况下,您应该使用 std::vector
而不是 std::list
.
您可以尝试使用 dynamic_cast 检查类型。
但是在 Java 中不存在与 Java 中相同的强大反射,C++,您可以看到具体的实现。
无论如何,不确定我是否正确理解了您的问题。
这个问题与C++ 在模板中获取类型名称有关,接受的答案应该足够了,即在代码中定义一种解析器。当然,您可以使用type_info
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?