使用函数指针来代替switch语句
2009-06-26 14:49
549 查看
使用函数指针来代替
Switch
语句【以下是公司项目中部分的
videoSwitchAgent
】
使用一个单件的工程,将要创建的实体用不同的函数来表示,在这个工厂里面用一个
map
来保存所有创建实体的方法。由于
map
是可以链表结构没有大小限制,这样就可以做到便于扩充。
代码如下:
// EntityCreationFactory.h
namespace TA_IRS_App
{
class EntityCreationFactory
{
public:
typedef TA_Base_Bus::IEntity* ( *CreatorFunction )( TA_Base_Core::IEntityDataPtr entityData );
static EntityCreationFactory& getInstance();
void registerFunction( const std::string& type, CreatorFunction function );
TA_Base_Bus::IEntity* createEntity( TA_Base_Core::IEntityDataPtr entityData );
private:
EntityCreationFactory();
virtual ~EntityCreationFactory() {};
EntityCreationFactory( const EntityCreationFactory& theEntityCreationFactory );
EntityCreationFactory& operator=( const EntityCreationFactory& theEntityCreationFactory );
static TA_Base_Bus::IEntity* createCamera( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createVideoMonitor( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createVideoOutputGroup( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createQuad( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createBVSStage( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createSequence( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createRecordingUnit( TA_Base_Core::IEntityDataPtr entityData );
typedef std::map< std::string, CreatorFunction > FunctionMap;
FunctionMap m_functions;
static EntityCreationFactory* s_singleton;
static TA_Base_Core::ReEntrantThreadLockable s_singletonLock
}; // EntityCreationFactory
} // TA_IRS_App
//EntityCreeationFactory.cpp
namespace TA_IRS_App
{
EntityCreationFactory* EntityCreationFactory::s_singleton = NULL;
TA_Base_Core::ReEntrantThreadLockable EntityCreationFactory::s_singletonLock;
EntityCreationFactory& EntityCreationFactory::getInstance()
{
if ( s_singleton == NULL )
{
TA_Base_Core::ThreadGuard guard( s_singletonLock );
if ( s_singleton == NULL )
{
s_singleton = new EntityCreationFactory();
}
}
return *s_singleton;
}
EntityCreationFactory::EntityCreationFactory()
{
registerFunction( TA_Base_Core::Camera::getStaticType(), createCamera );
registerFunction( TA_Base_Core::VideoMonitor::getStaticType(), createVideoMonitor );
registerFunction( TA_Base_Core::VideoOutputGroup::getStaticType(), createVideoOutputGroup );
registerFunction( TA_Base_Core::Quad::getStaticType(), createQuad );
registerFunction( TA_Base_Core::BVSStage::getStaticType(), createBVSStage );
registerFunction( TA_Base_Core::Sequence::getStaticType(), createSequence );
registerFunction( TA_Base_Core::RecordingUnit::getStaticType(), createRecordingUnit );
}
void EntityCreationFactory::registerFunction( const std::string& type, CreatorFunction function )
{
TA_ASSERT( m_functions.end() == m_functions.find( type ),
"A function is already registered for this type." );
m_functions[ type ] = function;
}
TA_Base_Bus::IEntity* EntityCreationFactory::createEntity( TA_Base_Core::IEntityDataPtr entityData )
{
std::string type = entityData->getType();
LOG_GENERIC(SourceInfo, TA_Base_Core::DebugUtil::DebugInfo, "the type is %s", type.c_str());
FunctionMap::iterator it = m_functions.find( type );
if ( m_functions.end() == it )
{
LOG_GENERIC( SourceInfo, TA_Base_Core::DebugUtil::DebugInfo,
"Entity could not be created because it is of an unrecognised type: %s", type.c_str() );
return 0;
}
return it->second( entityData );
}
// Private methods
TA_Base_Bus::IEntity* EntityCreationFactory::createCamera( TA_Base_Core::IEntityDataPtr entityData )
{
TA_Base_Bus::IEntity *pResult = NULL;
return pResult;
}
// Private methods
TA_Base_Bus::IEntity* EntityCreationFactory::createCamera( TA_Base_Core::IEntityDataPtr entityData )
{
TA_Base_Bus::IEntity *pResult = NULL;
return pResult;
}
} // end TA_IRS_App
// client
TA_Base_Bus::IEntity *pEntity = EntityAccessFactory::getInstance().createEntity();
Switch
语句【以下是公司项目中部分的
videoSwitchAgent
】
使用一个单件的工程,将要创建的实体用不同的函数来表示,在这个工厂里面用一个
map
来保存所有创建实体的方法。由于
map
是可以链表结构没有大小限制,这样就可以做到便于扩充。
代码如下:
// EntityCreationFactory.h
namespace TA_IRS_App
{
class EntityCreationFactory
{
public:
typedef TA_Base_Bus::IEntity* ( *CreatorFunction )( TA_Base_Core::IEntityDataPtr entityData );
static EntityCreationFactory& getInstance();
void registerFunction( const std::string& type, CreatorFunction function );
TA_Base_Bus::IEntity* createEntity( TA_Base_Core::IEntityDataPtr entityData );
private:
EntityCreationFactory();
virtual ~EntityCreationFactory() {};
EntityCreationFactory( const EntityCreationFactory& theEntityCreationFactory );
EntityCreationFactory& operator=( const EntityCreationFactory& theEntityCreationFactory );
static TA_Base_Bus::IEntity* createCamera( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createVideoMonitor( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createVideoOutputGroup( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createQuad( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createBVSStage( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createSequence( TA_Base_Core::IEntityDataPtr entityData );
static TA_Base_Bus::IEntity* createRecordingUnit( TA_Base_Core::IEntityDataPtr entityData );
typedef std::map< std::string, CreatorFunction > FunctionMap;
FunctionMap m_functions;
static EntityCreationFactory* s_singleton;
static TA_Base_Core::ReEntrantThreadLockable s_singletonLock
}; // EntityCreationFactory
} // TA_IRS_App
//EntityCreeationFactory.cpp
namespace TA_IRS_App
{
EntityCreationFactory* EntityCreationFactory::s_singleton = NULL;
TA_Base_Core::ReEntrantThreadLockable EntityCreationFactory::s_singletonLock;
EntityCreationFactory& EntityCreationFactory::getInstance()
{
if ( s_singleton == NULL )
{
TA_Base_Core::ThreadGuard guard( s_singletonLock );
if ( s_singleton == NULL )
{
s_singleton = new EntityCreationFactory();
}
}
return *s_singleton;
}
EntityCreationFactory::EntityCreationFactory()
{
registerFunction( TA_Base_Core::Camera::getStaticType(), createCamera );
registerFunction( TA_Base_Core::VideoMonitor::getStaticType(), createVideoMonitor );
registerFunction( TA_Base_Core::VideoOutputGroup::getStaticType(), createVideoOutputGroup );
registerFunction( TA_Base_Core::Quad::getStaticType(), createQuad );
registerFunction( TA_Base_Core::BVSStage::getStaticType(), createBVSStage );
registerFunction( TA_Base_Core::Sequence::getStaticType(), createSequence );
registerFunction( TA_Base_Core::RecordingUnit::getStaticType(), createRecordingUnit );
}
void EntityCreationFactory::registerFunction( const std::string& type, CreatorFunction function )
{
TA_ASSERT( m_functions.end() == m_functions.find( type ),
"A function is already registered for this type." );
m_functions[ type ] = function;
}
TA_Base_Bus::IEntity* EntityCreationFactory::createEntity( TA_Base_Core::IEntityDataPtr entityData )
{
std::string type = entityData->getType();
LOG_GENERIC(SourceInfo, TA_Base_Core::DebugUtil::DebugInfo, "the type is %s", type.c_str());
FunctionMap::iterator it = m_functions.find( type );
if ( m_functions.end() == it )
{
LOG_GENERIC( SourceInfo, TA_Base_Core::DebugUtil::DebugInfo,
"Entity could not be created because it is of an unrecognised type: %s", type.c_str() );
return 0;
}
return it->second( entityData );
}
// Private methods
TA_Base_Bus::IEntity* EntityCreationFactory::createCamera( TA_Base_Core::IEntityDataPtr entityData )
{
TA_Base_Bus::IEntity *pResult = NULL;
return pResult;
}
// Private methods
TA_Base_Bus::IEntity* EntityCreationFactory::createCamera( TA_Base_Core::IEntityDataPtr entityData )
{
TA_Base_Bus::IEntity *pResult = NULL;
return pResult;
}
} // end TA_IRS_App
// client
TA_Base_Bus::IEntity *pEntity = EntityAccessFactory::getInstance().createEntity();
相关文章推荐
- 使用命令对象代替switch语句的写法示例
- 除了switch,PHP就不能像Python一样使用Map来代替多分枝条件语句吗? (只讨论技术)
- 使用函数指针和多态代替冗长的if-else或者switch-case
- 使用Action表驱动代替switch…case语句
- C语言 使用数组代替switch分支语句降低圈复杂度
- 使用函数指针和多态代替冗长的if-else或者switch-case
- 使用标准库和函数指针简化switch语句
- 使用命令对象代替switch语句的写法示例
- 使用Action表驱动代替switch…case语句
- 函数指针实现转移表代替switch语句
- switch分支语句注意事项及注册界面的使用思路
- 在VC中使用switch语句时遇到“error C2360: initialization of 'k' is skipped by 'case' label”的编译错误。
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case和条件语句
- Swift 中的开关语句switch在swift中的使用
- 实现1+2+3+...+n。要求不能使用乘除法,for,while,if,else,switch,case,等关键字及条件判断语句。
- switch 语句关于case的使用
- C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句
- Access 中case when then else end不支持使用switch代替
- 求 1+2+...+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句 (A?B:C)。
- Swift中if与switch语句使用一例