来自docs:
在内部,QList表示为指向项目的指针数组 类型为T.如果T本身是指针类型或基本类型为否 大于指针,或者如果T是Qt的共享类之一,那么 QList将项直接存储在指针数组中。
我很想知道,QList
如何根据类型决定是否存储指针或项目?
他们是否使用一些深奥的模板语法来实现?
答案 0 :(得分:2)
让我们阅读来源(我正在使用Qt 4.8)。
<强> qlist.h 强>:
struct Node {
void *v;
#if defined(Q_CC_BOR)
Q_INLINE_TEMPLATE T &t();
#else
Q_INLINE_TEMPLATE T &t()
{ return *reinterpret_cast<T*>(QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic
? v : this); }
#endif
};
QList
使用QTypeInfo
来确定类型属性。 QTypeInfo
分别为各种类型声明。在 qglobal.h :
未知类型的默认声明:
template <typename T>
class QTypeInfo
{
public:
enum {
isPointer = false,
isComplex = true,
isStatic = true,
isLarge = (sizeof(T)>sizeof(void*)),
isDummy = false
};
};
指针声明:
template <typename T>
class QTypeInfo<T*>
{
public:
enum {
isPointer = true,
isComplex = false,
isStatic = false,
isLarge = false,
isDummy = false
};
};
用于方便类型信息声明的宏:
#define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
class QTypeInfo<TYPE > \
{ \
public: \
enum { \
isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
isLarge = (sizeof(TYPE)>sizeof(void*)), \
isPointer = false, \
isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0) \
}; \
static inline const char *name() { return #TYPE; } \
}
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
template<> \
Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
原始类型的声明:
Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE); /* ... */
它也是针对特定的Qt类型定义的,例如:在 qurl.h :
Q_DECLARE_TYPEINFO(QUrl, Q_MOVABLE_TYPE);
或 qhash.h :
Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE);
当QList
使用QTypeInfo<T>
时,编译器会选择最接近的当前QTypeInfo
定义。