2

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

因为,据我所知,接口和实现不能有相同的名称(如果它们是虚拟的,它们就会有相同的名称)。如果类层次结构很深,那就有点尴尬了。

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

4

2 回答 2

2

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

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

    Delegate delegate;
};

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

于 2012-11-30T13:18:00.703 回答
0

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

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

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

于 2012-12-01T01:00:39.013 回答