gpt4 book ai didi

c++ - 尽量避免重复调用一个函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:08 25 4
gpt4 key购买 nike

我有一个非常简单的类定义如下:

#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,并且可以在运行时查询函数。

关于c++ - 尽量避免重复调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com