
On 9/18/07, Marco Costalba <mcostalba@gmail.com> wrote:
template<typename Values, typename Args> Base* doObject(KeyRef nm, Values& v) const { Range r; if (!find_range<Args>(nm, r)) return NULL; /* no function with the same number of arguments */
const SignatureClass<Base, Args>* p = find<Args>(r);
This is the core of all the stuff. At runtime the passed in argument types 'Args' are checked against the factory wrappers stored in a map to see if one of them support the same type of arguments. template<typename Args> const SignatureClass<Base, Args>* find(const Range& r) const { for (const_iterator it = r.first; it != r.second; ++it) { const SignatureClass<Base, Args>* p = check_type<Args>((*it).second); if (p) return p; } return NULL; } And finally: template<typename Args> const SignatureClass<Base, Args>* check_type(const StorableClass* p) const { // check c'tor arguments type at runtime return dynamic_cast<const SignatureClass<Base, Args>*>(p); } All this dynamic plomorphism stuff is, again, necessary (at least I haven't found nothing better) _only_ because supported classes are not known at factory instantation time. If it was known I could use a fusion map to store everything and the trick is done. But a fusion map cannot be changed at runtime! If you add new classes to your map you have a _new_ map type. So you cannot foreseen a map variable as a member data. That's the problem. class factory { .... a_fusion_map_type myFactoriesMap; template<typename F> void add_factory(const F& f) { myFactoriesMap << f; // not possible because 'a_fusion_map_type' changes } } Thanks Marco