检测虚拟方法

时间:2013-06-16 05:50:13

标签: c++ polymorphism portability derived

我有一个类解析文档并调用派生类来通知在流中找到的某些事件。因为解析器必须处理编码并将文档的一部分重写为字符串,所以如果虚拟方法没有被覆盖,我希望避免重写。伪代码:

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代码中,我们将编写一个函数并将指向该函数的指针传递给实现。在内部,它会检查指针是否指向某个东西并调用它。如何使用派生类实现相同的功能?即。在浪费时间/ CPU周期/内存构造甚至可能不需要的字符串之前,检查虚拟方法是否实际存在于派生类中。

编译时间检查,提供便携性,是理想的,但我认为这与v-table有关,所以运行时检查也可以。

经过更多的研究后,很明显v-table已经出局,而且这几乎是不可能的。我会略微改变我的问题,问上面是否可能使用某种类型的,也许是模板,诡计?

1 个答案:

答案 0 :(得分:0)

您可以将参数设为std::future,然后使用简单的派生方法。

或者代替字符串,传入代理或可以提供它的函数。

或转动表格,不传递任何内容,并在Base中有一个成员函数,它返回创建的字符串。

另一种方法是为该特性提供虚拟谓词函数:在您的基类中它返回false,其他返回true,因此您可以在实际工作之前调用它。或者它可以为实现返回一个指向函数的指针,如果它可能在静态函数中可行的话。 (这可以作为另一个参数传递......)

向你介绍研究结论vtables会很有趣。

模板仅在您可以在编译时告诉目标时帮助您。您所说的问题意味着处理仅在运行时出现的信息。这需要一些实际传递的指针或其他信息。但是你可能会对问题进行精炼描述。