enum { result=(sizeof(f<T>(0))==sizeof(Yes)) };
};
+template<typename T>
+struct RemoveConst
+{ typedef T Type; };
+
+template<typename T>
+struct RemoveConst<const T>
+{ typedef T Type; };
+
/**
A collection of objects that can be loaded from a datafile. Each object is
identified by a name, which must be unique across the entire collection.
ItemKeywordSeq keywords;
ItemCreatorSeq creators;
+ Collection(const Collection &);
+ Collection &operator=(const Collection &);
public:
+ Collection() { }
virtual ~Collection();
/**
if(items.count(name))
throw KeyError("Duplicate key '"+name+"' in collection");
- items[name]=new Item<T>(d);
+ items[name]=new Item<typename RemoveConst<T>::Type>(d);
}
/**
template<typename T>
T &get(const std::string &name) const
{
+ typedef typename RemoveConst<T>::Type NCT;
+
ItemMap::const_iterator i=items.find(name);
if(i==items.end())
throw KeyError("Item '"+name+"' not found in collection");
- const Item<T> *item=dynamic_cast<const Item<T> *>(i->second);
+ const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
if(!item)
throw TypeError("Item '"+name+"' is not of correct type");
template<typename T>
T &get(const std::string &name)
{
+ typedef typename RemoveConst<T>::Type NCT;
+
ItemMap::const_iterator i=items.find(name);
if(i==items.end())
{
for(ItemCreatorSeq::iterator j=creators.begin(); j!=creators.end(); ++j)
- if(T *d=(*j)->create<T>(*this, name))
+ if(NCT *d=(*j)->create<NCT>(*this, name))
{
// We already know that the item didn't exist yet
- items[name]=new Item<T>(d);
+ items[name]=new Item<NCT>(d);
return *d;
}
throw KeyError("Item '"+name+"' not found in collection");
}
- const Item<T> *item=dynamic_cast<const Item<T> *>(i->second);
+ const Item<NCT> *item=dynamic_cast<const Item<NCT> *>(i->second);
if(!item)
throw TypeError("Item '"+name+"' is not of correct type");