我想用C ++编写一个ServiceLocator设计模式类。 目的是提供三种方法:
CServiceLocator::push(obj);
CServiceLocator::get<IObjType>();
CServiceLocator::getAll<IObjType>();
我更喜欢保留引用而不是对象的指针。所以我想使用引用对象的std :: vector。为了做到这一点,我创建了一个std :: vector但我无法编译,我在网上看到我无法将引用转换为(void *)。
以下是我班级的代码:
class CServiceLocator
{
public:
virtual ~CServiceLocator(){}
template <class T>
static void push(T &object)
{
m_objectList.push_back((void*)object);
}
template <class T>
static T & get()
{
for (std::vector<void*>::iterator it = m_objectList.begin(); it != m_objectList.end(); it++)
{
//on essaie de faire un dynamic cast pour trouver le premier objet du bon type
try
{
T & obj = (T&)dynamic_cast<T>(*it);
return obj;
}
catch (std::bad_cast &)
{
//il n'est pas du bon type
}
}
}
template <class T>
static std::vector<T&> & getAll()
{
std::vector<T&> result;
for (std::vector<void*>::iterator it = m_objectList.begin(); it != m_objectList.end(); it++)
{
//on essaie de faire un dynamic cast pour trouver les objets du bon type
try
{
T & obj = (T&)dynamic_cast<T>(*it);
result.push_back(obj);
}
catch (std::bad_cast &)
{
//il n'est pas du bon type
}
}
return result;
}
private:
CServiceLocator() {}
static std::vector<void*> m_objectList;
};
以下是预期结果的使用示例
A a;
B b;
CServiceLocator::push<A>(a);
CServiceLocator::push<B>(b);
A &a1 = CServiceLocator::get<A>();
任何人都知道如何做到这一点?
答案 0 :(得分:3)