gpt4 book ai didi

c++ - 在 C++ 中保留引用对象的 vector

转载 作者:行者123 更新时间:2023-11-30 02:44:29 26 4
gpt4 key购买 nike

<分区>

我想用 C++ 编写一个 ServiceLocator 设计模式类。目的是提供三种方法:

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

我更喜欢保留一个引用而不是对象的指针。所以我想使用引用对象的 std::vector 。为此,我制作了一个 std::vector 但无法编译,而且我在网上看到无法将引用转换为 (void*)。

这是我类(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;
};

这是预期结果的用法示例

A a;
B b;

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

有人知道如何做到这一点吗?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com