我有一个非常简单的类定义如下:
#include "../bshttp/controllers.h"
#include <iostream>
#include <string>
class DerivedController : public BS_Controllers
{
public:
DerivedController():BS_Controllers(this)
{
m_urlRules["print"] = REG_NAME &DerivedController::print;
//regController(REG_NAME &DerivedController::print,"print");
regController(REG_NAME &DerivedController::printView,"printView");
}
void * print()
{
return NULL;
}
void * printView()
{
cout<<"Print view!"<<endl;
return NULL;
}
};
无论是哪里
m_urlRules["print"] = REG_NAME &DerivedController::print;
或
regController(REG_NAME &DerivedController::printView,"printView");
必须为所有成员函数调用。它的作用是获取类的成员函数指针并映射为字符串,因此稍后可以用字符串标识该函数。
一切都很好,但当类结构变大时,程序员将不得不为每个成员函数重复调用该函数。有没有办法使用预处理器或任何预处理库(例如 boost-wave),以便程序员不必进行这些重复调用?
编辑:很抱歉造成混淆,我显然没有在这里充分描述问题。我正在将字符串映射到成员函数指针;
m_urlRules 是一个以字符串为键,成员函数指针为值的std::mapregController 基本上是 m_urlRules 的 setter 函数,所以这两个语句有效地做同样的事情,将字符串映射到成员函数。
REG_NAME 是一个宏,用于替换非常丑陋的类型转换。
我想做的是,如果类具有以下结构,
class DerivedController : public BS_Controllers
{
public:
DerivedController():BS_Controllers(this);
void * print();
void * print2();
void * print3();
void * print4();
};
我不必在构造函数中执行以下操作:
m_urlRules["print"] = REG_NAME &DerivedController::print;
m_urlRules["print1"] = REG_NAME &DerivedController::print1;
m_urlRules["print2"] = REG_NAME &DerivedController::print2;
m_urlRules["print3"] = REG_NAME &DerivedController::print3;
m_urlRules["print4"] = REG_NAME &DerivedController::print4;
好吧,您正在尝试自己构建运行时类型信息 (RTTI),因此没有预处理器宏可用于此。主要是因为预处理器宏扩展到一个地方,你声明的地方和你注册函数的地方是不同的。
Qt 和 qmake 做类似的事情,它找到标记为信号/槽的函数,并为 RTTI 构建一个 moc 对象。这大概是使用 C++ 所能获得的最好结果。其他语言,如 java 和 delphi,具有比 c++ 更多的 RTTI,并且可以在运行时查询函数。
我是一名优秀的程序员,十分优秀!