我正在为一堆对象的延迟初始化创建一个类(不是完全通用的,都在我的控制之下)。每种类型只存在一个对象。我已经使用std::vector
and有一个线性时间实现boost::any
。希望它可以更好地了解我在说什么。
我可以假设我想要访问的所有对象都有
typedef boost::shared_ptr<CLASSNAME> HandleType
在它们的定义中,它们都有一个构造函数,该构造函数通过引用获取 ObjectProvider。
class ObjectProvider {
typedef std::vector<boost::any> ContainerType;
ObjectProvider() : container() {}
public:
// this is where the relevant method is
template <class TElementType>
typename TElementType::HandleType get() {
for (ContainerType::iterator it = container.begin(); it != container.end(); ++it) {
try {
return boost::any_cast<typename TElementType::HandleType>(*it);
} catch (boost::bad_any_cast &) {}
}
// failed to find it so create it
TElementType::HandleType handle = boost::make_shared<TElementType>(*this);
container.push_back(handle);
return handle;
}
private:
ContainerType container;
};
// ----- FOR TESTING -----
class SomeObject {
public:
SomeObject(ObjectProvider &) {}
typedef boost::shared_ptr<SomeObject> HandleType;
};
int main(int argc, char** argv) {
ObjectProvider provider;
// expensive creation is done here
SomeObject::HandleType obj1 = provider.get<SomeObject>();
// expensive creation is not re-done
SomeObject::HandleType obj2 = provider.get<SomeObject>();
assert (obj1 == obj2); // pointers should point to the same object
}
一些动机:其中许多对象(它们是各种服务的客户端)需要创建各种类型的附加客户端,但我不想每次都重新创建它们。所以这个类的目标是提供一种缓存已经创建的客户端的方法。
这是我的问题:
有一个更好的方法吗?
特别是,有没有办法避免循环输入
get<...>()
并以某种方式按类型键入?我希望有恒定时间访问而不是线性时间,并且当前方法无法利用可用于查找的类型信息。
只是为了对我的想法做一些额外的解释,我可能会在 Java 中做这样的事情:
Map<Class<?>, Object> objMap;
public <T> T get(Class<T> class) {
Object obj = objMap.get(class);
if (obj != null) {
return (T)obj;
} else {
T newObj = ;// fiddle with java reflection to create a new instance
objMap.put(class, newObj);
}
}