在C ++中保留引用对象的向量

时间:2014-08-12 07:10:20

标签: c++ vector reference service-locator

我想用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>();

任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:3)

您不能直接制作std::vector个参考文献。

如果您希望完成与此相似的事情,您有两种选择: