Skip to main content
deleted 4 characters in body
Source Link
lgm42
  • 621
  • 1
  • 9
  • 30
A a();a; B b();b; CServiceLocator::push<A>(a); CServiceLocator::push<B>(b); A &a1 = CServiceLocator::get<A>(); 
A a(); B b(); CServiceLocator::push<A>(a); CServiceLocator::push<B>(b); A &a1 = CServiceLocator::get<A>(); 
A a; B b; CServiceLocator::push<A>(a); CServiceLocator::push<B>(b); A &a1 = CServiceLocator::get<A>(); 
Post Closed as "Duplicate" by juanchopanza c++
Source Link
lgm42
  • 621
  • 1
  • 9
  • 30

Keep a vector of reference objects in C++

I would like to write a ServiceLocator design pattern class in C++. The aim is to provide three methods :

CServiceLocator::push(obj); CServiceLocator::get<IObjType>(); CServiceLocator::getAll<IObjType>(); 

I prefer keep a reference instead of pointers of objects. So I would like to use a std::vector of references objects. In order to do that, I make a std::vector<void*> but I can't compile and I see on the web that I can't cast a reference into a (void*).

Here is the code of my class :

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; }; 

Here is a usage example of expected result

A a(); B b(); CServiceLocator::push<A>(a); CServiceLocator::push<B>(b); A &a1 = CServiceLocator::get<A>(); 

Any one has idea on how to do that ?