如何清理虚拟功能链中的功能参数?

时间:2015-04-11 06:33:04

标签: c++

我正在尝试让我的虚拟功能看起来更清洁,以供最终用户使用。虚函数的一个问题是它们在保持链中强制使用相同的类型。但是很多时候这是不可取的。因为它迫使用户向上指示。所以我想到了这个结构(onHello)。您可以看到允许更改最终用户类中的类型。 (onHi)是传统的做法。我想知道这种方法是否普遍使用,为什么或为什么不使用?

struct base
{
    virtual void onHello( base& X ) { x_printf( "Hello - setting base" ); }
    virtual void onHi   ( base& X ) { x_printf( "Hi - setting base" ); }
};

template< typename T >
struct base_link : public base
{
    virtual void onHello( base& X ) override { /*do type checking here*/ ((T*)this)->onHello( *(T*)&X ); }
};

struct bar_yes : public base_link<bar_yes>
{
                 bar_yes( int Y ) : Yes( Y ) {}
            void onHello( bar_yes& Y )          { base::onHello( Y ); Yes = Y.Yes; }
    virtual void onHi   ( base&    X ) override { /*do type checking here*/ base::onHi( X ); Yes = ((bar_yes*)&X)->Yes; }

    int Yes;
};

struct bar_no : public base_link<bar_no>
{
                 bar_no ( int N ) : No( N ) {}
            void onHello( bar_no& N )          { base::onHello( N ); No = N.No;  }
    virtual void onHi   ( base&   X ) override { /*do type checking here*/ base::onHi( X ); No = ((bar_no*)&X)->No; }

    int No;
};

void main()
{
    bar_yes     TestYes[2] { 0, 1 };
    bar_no      TestNo[2]  {100,200};
    base*       pBase[]    { &TestYes[0], &TestNo[0] };

    pBase[0]->onHello( TestYes[1] );
    pBase[0]->onHi   ( TestYes[1] );
    pBase[1]->onHello( TestNo[1] );
    pBase[1]->onHi   ( TestNo[1] );
}

0 个答案:

没有答案