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

时间:2012-11-30 12:47:35

标签: c++ static-polymorphism

当我使用静态多态(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();
};

因为据我所知,接口和实现不能具有相同的名称(就像它们是虚拟的一样)。如果阶级层次很深,那就太尴尬了。

也许有一些不错的方法可以解决它?或者也许我错了?

2 个答案:

答案 0 :(得分:2)

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

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

    Delegate delegate;
};

这样做的缺点是为委托对象提供构造函数参数更加笨拙,但这并不难管理。

答案 1 :(得分:0)

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

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

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