logplus/OSGDataModel/include/ObjectGenralFactory.h
2025-10-29 17:23:30 +08:00

84 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file ObjectGenralFactory.h
* @brief 通用的模板工厂类支持任意数据类型作为key,value为创建任意基类的函数指针
* @date 2014-5-28
* @author: liyonggang
*/
#ifndef PAI_FRAME_OSGGENERALFACTORY_H
#define PAI_FRAME_OSGGENERALFACTORY_H
#pragma warning( push ,0)
#include <map>
#include "OSGDataModel.h"
#pragma warning( pop )
BEGIN_OSGDATAMODEL_NAMESPACE;
template <typename keyClassName,typename baseclassname>
class CObjectGenralFactory
{
public:
typedef baseclassname* (*pCreateObjectFunction)();
void Rigister( keyClassName key,pCreateObjectFunction func )
{
m_map[key] = func;
}
baseclassname* CreateObject(keyClassName key)
{
typename std::map< keyClassName,pCreateObjectFunction >::iterator it = m_map.find( key );
if ( it != m_map.end() )
{
return (it->second)();
}
return NULL;
}
bool IsSupport( keyClassName s )
{
return m_map.find( s ) != m_map.end();
}
std::map< keyClassName,pCreateObjectFunction > m_map;
};
template <typename keyClassName,typename baseclassname>
class CObjectGenralFactoryAuto
{
public:
typedef baseclassname* (*pCreateObjectFunction)();
CObjectGenralFactoryAuto( keyClassName* keyArr,pCreateObjectFunction func )
{
keyClassName defaultKey;
for( long i = 0;;i++)
{
if( keyArr[i] != defaultKey )
{
baseclassname::GetFatory().Rigister( keyArr[i],func );
}else
{
break;
}
}
}
};
#define BEGIN_REGISTER(keyClassName,baseclassname,className)\
baseclassname *Create##className()\
{\
return new className() ;\
}\
keyClassName g_##className##RegPairs[]={\
#define END_REGISTER(keyClassName,baseclassname,className)\
,keyClassName() };\
datamodel::CObjectGenralFactoryAuto<keyClassName,baseclassname> g_##className##GeneralRegister(g_##className##RegPairs,Create##className);
OSGDATAMODEL_EXPORT QStringList LoadAllPlugin(const QString &PluginTypeName);
END_OSGDATAMODEL_NAMESPACE
#endif