使用函数指针来代替switch语句
来源:互联网 发布:maven 书籍 推荐 知乎 编辑:程序博客网 时间:2024/05/29 15:54
使用函数指针来代替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语句
- 用函数指针代替switch-case
- 使用标准库和函数指针简化switch语句
- 使用map+函数指针代替switch和if-else的一个例子
- 使用switch case语句来显示月份的对应天数
- 使用switch语句来进行程序中的加减乘除运算
- 分段函数switch语句
- SQL语句 使用...代替
- C_使用switch语句
- switch语句的使用
- switch语句使用总结
- switch语句的使用
- switch语句的使用
- switch语句使用总结
- switch语句的使用
- 用数组代替if-else和switch-case语句
- 使用类来代替enum
- C++学习代码--return
- 我理解的逻辑地址、线性地址、物理地址和虚拟地址
- 大心脏
- C++学习代码--pointer
- 排序(2)
- 使用函数指针来代替switch语句
- 排序(3)
- 十个糟糕的程序员的行为
- C++学习代码--file
- Android 初始化语言(Android init Language翻译)
- 外企九年-我最终选择放弃
- 在Vim中编辑Qt4
- 浏览器缓存知识收藏
- 经济衰退时期发屈CRM潜力