我有一个非常简单的类定义如下:
#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::map,以字符串为键,成员函数指针为值 regController 基本上是 m_urlRules 的设置器函数,因此这两个语句有效地执行相同的操作,将字符串映射到成员函数。
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;