T &get(const std::string &name)
{
typedef typename RemoveConst<T>::Type NCT;
- return extract<NCT>(get_var(name, get_type<NCT>()));
+ return extract<NCT>(get_var(name, get_type<NCT>(name)));
}
private:
CollectionItemType<T> &add_type();
private:
- /// Returns the descriptor for a type, or null if one isn't defined.
+ /** Returns the descriptor for a type, or null if one isn't defined. An
+ optional name can be given to prioritize matching types. */
template<typename T>
- CollectionItemTypeBase *get_type() const;
+ CollectionItemTypeBase *get_type(const std::string & = std::string()) const;
/// Gets a descriptor with the same type as another descriptor.
CollectionItemTypeBase *get_type(const CollectionItemTypeBase &) const;
}
template<typename T>
-CollectionItemTypeBase *Collection::get_type() const
+CollectionItemTypeBase *Collection::get_type(const std::string &name) const
{
for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j)
if(dynamic_cast<CollectionItemType<T> *>(*j))
return *j;
+ CollectionItemTypeBase *type = 0;
for(TypeList::const_iterator j=types.begin(); j!=types.end(); ++j)
if((*j)->can_extract<T>())
- return *j;
- return 0;
+ {
+ if(!name.empty() && (*j)->match_name(name))
+ return *j;
+ type = *j;
+ }
+ return type;
}
} // namespace DataFile