void item(const std::string &n) { make_sub<T>().into(dynamic_cast<typename CollectionType<typename T::Loader>::Type &>(coll), n).load(); }
};
- template<typename T, bool = NeedsCollection<typename T::Loader>::value>
- class ItemLoader;
-
private:
using ItemMap = std::map<std::string, Variant>;
Collection *get_fallback() const { return fallback; }
};
-template<typename T>
-class Collection::ItemLoader<T, false>: public T::Loader
-{
-public:
- ItemLoader(T &o, Collection &):
- T::Loader(o)
- { }
-};
-
-template<typename T>
-class Collection::ItemLoader<T, true>: public T::Loader
-{
-public:
- ItemLoader(T &o, Collection &c):
- T::Loader(o, dynamic_cast<typename T::Loader::Collection &>(c))
- { }
-};
-
class MSPDATAFILE_API CollectionItemTypeBase
{
void load_item(Collection &coll, Parser &parser, const std::string &name) const override
{
std::unique_ptr<T> obj = std::make_unique<T>();
- Collection::ItemLoader<T> ldr(*obj, coll);
- ldr.load(parser);
+ std::optional<typename T::Loader> ldr;
+ if constexpr(NeedsCollection<typename T::Loader>::value)
+ ldr.emplace(*obj, dynamic_cast<typename CollectionType<typename T::Loader>::Type &>(coll));
+ else
+ ldr.emplace(*obj);
+ ldr->load(parser);
coll.add(name, std::move(obj));
}
};