【发布时间】:2023-01-05 01:19:03
【问题描述】:
考虑以下:
class RecordCommon {
public:
virtual const char* GetShortName(void) const = 0;
...
virtual void DoSomeWork(void);
};
class RecordCLDT : public RecordCommon {
virtual const char* GetShortName(void) const { return "CLDT"; }
};
void RecordCommon::DoSomeWork(void) {
...
log(GetShortName());
...
}
我想要的是像 RecordCLDT::GetShortName(void) 这样的静态方法,它会在不对项目进行重大重构的情况下返回“CLDT”。也许这可以通过一些宏或智能模板技术来完成?
我需要让 RecordCommon::DoSomeWork(void) 调用正确的 GetShortName() 函数,如果我只是将虚拟 GetShortName() 替换为静态函数则不会。
重写 RecordCommon 的每个子类将非常耗时,尤其是因为代码中使用了虚拟 GetShortName()。
【问题讨论】:
-
这就是 shell/perl/python 脚本的用途。不幸的是,在 C++ 的某个地方没有神奇的按钮,只需要找到并按下它就可以完成所有事情。有时您必须自己完成所有工作。备选方案:第 1 步:启用编译器标志,要求所有覆盖显式标记为
override,否则编译失败。第 2 步:修复所有编译失败。第 3 步:用静态函数替换非静态函数。第 4 步:修复所有编译失败。 -
为什么你想做一个静态的
RecordCLDT::GetShortName吗?你是使用this,来区分调用了哪个实现。 -
“我需要让
RecordCommon::DoSomeWork(void)调用正确的GetShortName()函数“ 称它为什么?没有给静态函数一个对象来处理,它是决定“正确函数”甚至是什么的对象。