静态多态性和方法名称 c++

Static polymorphism and method names c++

本文关键字:c++ 方法 多态性 静态      更新时间:2023-10-16

当我使用静态多态性(CRTP)时,有没有一种好方法可以给多态方法起名字?

template <class Derived> 
struct Base
{
    void interface()
    {
        // ...
        static_cast<Derived*>(this)->implementation();
        // ...
    }
    static void static_func()
    {
        // ...
        Derived::static_sub_func();
        // ...
    }
};
struct Derived : Base<Derived>
{
    void implementation();
    static void static_sub_func();
};

因为,据我所知,接口和实现不能有相同的名称(如果它们是虚拟的)。如果阶级等级制度很深,这有点尴尬。

也许有一些不错的方法来处理它?或者也许我错了?

我的方法是避免继承(无论 CRTP 感觉多么可爱),而是使用聚合。类模板提供接口,并依次提供带有实现的委托类。它看起来像这样:

template <class Delegate>
struct Interface
{
    void do_something()
    {
        // ...
        delegate.do_something();
        // ...
    }
    Delegate delegate;
};

这样做的缺点是向委托对象提供构造函数参数更麻烦,但这并不难管理。

当父类没有任何特殊功能时(如在典型的抽象接口中),我看不出为什么你不能在子类中重用函数名称。它将隐藏父方法,但这并不重要,因为您静态地告诉编译器您希望使用哪个版本。

但是,在您的情况下,您似乎希望父级在调用虚拟方法之前和之后做一些工作(闻起来像模板方法模式)。在这种情况下,无论使用运行时(虚拟)还是编译时 (CRTP) 多态性,都需要通过备用名称调用接口和实现方法。

如果foo是基中的接口/模板方法,那么无论运行时或编译时多态性如何,do_foofoo_impl似乎是实现函数的完全合理的名称。