virtual ~ItemCreatorBase() { }
template<typename S>
- S *create(Collection &coll, const std::string &name)
+ bool create(Collection &coll, const std::string &name, S *&ptr)
{
ItemCreatorBridge<S> *creator=dynamic_cast<ItemCreatorBridge<S> *>(this);
if(creator)
- return creator->create(coll, name);
- return 0;
+ {
+ ptr=creator->create(coll, name);
+ return true;
+ }
+ return false;
}
};
Gets an object of a specific type from the collection.
*/
template<typename T>
- T &get(const std::string &name) const
+ T *get(const std::string &name) const
{
typedef typename RemoveConst<T>::Type NCT;
if(!item)
throw TypeError("Item '"+name+"' is not of correct type");
- return *item->data;
+ return item->data;
}
/**
invoked.
*/
template<typename T>
- T &get(const std::string &name)
+ T *get(const std::string &name)
{
typedef typename RemoveConst<T>::Type NCT;
if(i==items.end())
{
for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j)
- if(NCT *d=(*j)->create<NCT>(*this, name))
+ {
+ NCT *d=0;
+ if((*j)->create(*this, name, d))
{
// We already know that the item didn't exist yet
items[name]=new Item<NCT>(d);
- return *d;
+ return d;
}
+ }
throw KeyError("Item '"+name+"' not found in collection");
}
if(!item)
throw TypeError("Item '"+name+"' is not of correct type");
- return *item->data;
+ return item->data;
}
/**