#include <map>
#include <cstdlib>
#include <iostream>
class Foo
{
public:
void update( )
{
std::cout << "Foo::update()" << std::endl;
}
};
class Bar
{
public:
void update( )
{
std::cout << "Bar::update()" << 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()
{
std::cout << "Container::updateFoo() -> ";
m_foo.update();
}
void updateBar()
{
std::cout << "Container::updateBar() -> ";
m_bar.update();
}
private:
Foo m_foo;
Bar m_bar;
};
const Container::UpdateMethodMap Container::m_updateMethod = Container::initializeUpdateMethodMap();
/////////////////////////////////////////////////////////////////////////////
Container::UpdateMethodMap Container::initializeUpdateMethodMap()
{
Container::UpdateMethodMap updateMethodMap;
updateMethodMap["foo"] = &Container::updateFoo;
updateMethodMap["bar"] = &Container::updateBar;
return updateMethodMap;
}
//////////////////////////////////////////////////////////////////////
Container::updateMethod Container::getUpdateMethod( const std::string name )
{
UpdateMethodMap::const_iterator updateMethodMapItx = m_updateMethod.find( name );
if( updateMethodMapItx == m_updateMethod.end() )
{
return NULL;
}
return updateMethodMapItx->second;
}
/////////////////////////////////////////////////////////////////////////////
int main()
{
Container c;
c.update( "foo" );
c.update( "bar" );
return EXIT_SUCCESS;
}
//////////////////////////////////////////////////////////////////////