Hello -- On Friday, December 28, 2012 8:55 AM, Stephen Kelly wrote: > On Friday, December 28, 2012 08:36:21 Glen Mabey wrote: >> #define Q_DECLARE_METATYPE_2(h1,h2) \ >> QT_BEGIN_NAMESPACE \ >> template <> struct QMetaTypeId< h1,h2 > { \ >> enum { Defined = 1 }; \ >> static int qt_metatype_id() { \ >> static QBasicAtomicInt metatype_id = >> Q_BASIC_ATOMIC_INITIALIZER(0); \ if (!metatype_id.load()) >> metatype_id.storeRelease(qRegisterMetaType< h1,h2 >( #h1 "," #h2, >> reinterpret_cast< h1,h2 *>(quintptr(-1)))); \ return >> metatype_id.loadAcquire(); \ >> } \ >> }; \ >> QT_END_NAMESPACE >> >> This seems like a hack to me, but it works great with all of the compilers >> I've tried it with (32/64-bit g++ on linux and mac; mingw, MSVC 2008, >> 2010). > >> Does anyone foresee a big objection to this approach? > > Yes. At least, QNDArray is not part of the typeName() of the metatypes.
I guess, I don't understand that. > For testing, you can probably use this just after the QNDArray definition: > > Q_DECLARE_METATYPE_TEMPLATE_2ARG(QNDArray) > > but if this class is going to end up in Qt, then you would need to extend the > > QT_FOR_EACH_AUTOMATIC_TEMPLATE_2ARG(F) > > macro to deal with it. Wow, I just tried following the interactions of Q_DECLARE_METATYPE_TEMPLATE_2ARG, Q_DECLARE_METATYPE_TEMPLATE_2ARG_ITER, and Q_DECLARE_METATYPE_TEMPLATE_2ARG and that is some kind of macroization. So, if I understand things correctly, Q_DECLARE_METATYPE_TEMPLATE_2ARG_ITER is first declaring each of QMap, QHash, and QPair like this: template <class T1, class T2> class QMap; template <class T1, class T2> class QHash; template <class T1, class T2> struct QPair; and then after each one it is declaring a templated QMetaTypeId struct so that a user could easily do template < > struct QMetaTypeId< QMap<int, QString> >; for example (and at the same time handle something like this "template < > struct QMetaTypeId< QMap<int, QList<qint8> > >;") and that explicit instantiation would create the necessary QMetaTypeId so that QMap<int, QString> could be used as a QVariant, right? And by adding Q_DECLARE_METATYPE_TEMPLATE_2ARG(QNDArray) I could then do template < > struct QMetaTypeID< QNDArray<3,int> >; Somehow I like Q_DECLARE_METATYPE_2( QNDArray<3,int> ) better. Fewer characters?? Personal preference?? String concat hackery? Glen _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development