class QString { public:inline QString(const int i); }; class QGenericArgument { }; class ExtensionOption { }; template < typename T2 > struct if_ { typedef T2 type; }; template < typename T > struct c_imp { typedef const T & param_type; }; template < typename T > struct call_traits { typedef typename c_imp < T >::param_type param_type; }; class object; template < class T > struct rvalue_from_python_data { ~rvalue_from_python_data(); }; template < class T > struct extract_rvalue { typedef typename if_ < typename call_traits < T >::param_type >::type result_type; mutable rvalue_from_python_data < T > m_data; }; template < class T > struct select_extract { typedef typename if_ < extract_rvalue < T > >::type type; }; template < class T > struct extract:select_extract < T >::type { private:typedef typename select_extract < T >::type base; public:typedef typename base::result_type result_type; operator result_type() const { } extract(object const &); }; template < class Key, class T > class QHash { public:inline QHash() { } T & operator[](const Key & key); }; class type_details { typedef QGenericArgument(*func_python_to_cpp_type) (const object &); public: template < typename T > static type_details *create_value_type_details() { type_details *self = new type_details(); self->m_func_python_to_cpp = &python_to_value_type < T >; } func_python_to_cpp_type m_func_python_to_cpp; template < class T > static QGenericArgument python_to_value_type(const object & obj) { T *val = new T(extract < T > (obj)); } }; class type_manager { public:static type_manager & instance(); template < typename T > void register_value_type() { m_type_map[0] = type_details::create_value_type_details < T > (); } QHash < QString, type_details * >m_type_map; }; void foo() { type_manager::instance().register_value_type < ExtensionOption > (); }