Идеи для упрощения проектирования / устранения уровня косвенности в вызовах методов

В следующем фрагменте кода ниже (полная версия ideone) указатели на методы Container::void updateFoo а также Container::void updateBar зарегистрированы на карте m_updateMethod, Эти методы просто вызывают Foo::update а также Bar::update соответственно.

Есть ли способ избежать этого дополнительного уровня косвенности, храня Foo::update а также Bar::update?

class Foo
{
public:
    void update( )
    {
        std::cout << "Updating Foo ..." << std::endl;
    }
};

class Bar
{
public:
    void update( )
    {
        std::cout << "Updating Bar ..." << std::endl;
    }
};

class Container
{
public:
    typedef void (Container::*updateMethod)();
    typedef std::map<std::string , updateMethod> UpdateMethodMap;

    static const UpdateMethodMap    m_updateMethod;
    static UpdateMethodMap          initializeUpdateMethodMap();
    static updateMethod             getUpdateMethod( const std::string attributeName );

    void update( const std::string name )
    {
        updateMethod updater = getUpdateMethod( name );
        if( updater )
        {
            (this->*updater)();
        }
    }

    void updateFoo()
    {
        m_foo.update();
    }

    void updateBar()
    {
        m_bar.update();
    }

private:    
    Foo m_foo;
    Bar m_bar;
};

0 ответов

Другие вопросы по тегам