检测虚方法
detecting virtual methods
我有一个类,它解析文档并调用派生类来通知流中发现的某些事件。因为解析器必须处理编码并将文档的部分内容重写为字符串,所以如果虚拟方法没有被重载,我希望避免重写。伪代码:
class Parser
{
virtual void Callback ( string )
{
// Do nothing
}
private:
void ParseFile()
{
// Parse the file in the files encoding
// Checks and more checks
// Found sth. So need to convert to a string a call the
// callback, but if there is no callback what's the point
// in wasting cycles?
if ( Callback ) // In the world of C we could check for a func pointer
Callback( /* with the string */ )
}
}
class User : public Parser
{
void Callback ( string )
{
// This string means sth. me
}
}
class NonUser : public Parser
{
// I don't care about Callback so I won't implement it
}
在C代码中,我们会编写一个函数,并将指向该函数的指针传递给实现。在内部,它会检查指针是否指向某个对象并调用它。如何用派生类实现相同的功能?ie。在浪费时间/CPU周期/内存构造一个甚至可能不需要的字符串之前,检查虚拟方法是否确实存在于派生类中。
编译时检查,如果它是可移植的,将是理想的,但我认为这与v-tables有关,所以运行时检查也可能工作。
经过更多的研究,v表显然已经过时了,而且这几乎是不可能的。我将稍微改变一下我的问题,问一下上面的问题是否可能使用某种类型的,也许是模板,欺骗?
您可以将参数设置为std::future
,并使用简单的派生方法。
或者不传递字符串,而是传递一个代理或一个可以提供它的函数。
或者把表反过来,什么都不传递,在Base中有一个成员函数,返回创建时的字符串。
另一种方法是为该特性提供一个虚拟谓词函数:在基类中它返回false,其他返回true,因此您可以在实际工作开始之前调用它。或者,如果在静态函数中可能可行,它也可以为实现返回一个指向函数的指针。(这可以作为另一个参数传递…)
读一读你的研究结论表会很有趣。
模板只有在你能在编译时告诉你的目标时才有帮助。如您所述,这个问题意味着处理仅在运行时出现的信息。这就需要一些指针或者其他信息来传递。但是您可能会对问题提出一个更精确的描述。
相关文章:
- 检测win32服务创建和删除的最佳方法
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 通常使用什么方法来检测时间情况?
- 如何在窗口过程方法中检测击键?
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否有内置方法来检测异常值?
- 使用信号检测子进程何时终止的最佳方法是什么?
- 检测 X11 与韦兰的有效方法,最好是使用 CMake
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 如何实现一致的方法来检测鼠标按钮被按住
- 在 c++ 生成器中检测绘制线的窗口坐标的最佳方法
- 无法使方法存在检测机制正常工作
- 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?
- 寻找一种在运行时检测 valgrind/memcheck 的方法,而无需包含 valgrind 标头
- 检测C 模板元图中的空隙方法
- 使用OpenCV检测图像中垂直文本的方法
- 是否有方法检测内联函数ODR违规
- 方法检测指针是否指向…确切的地点