c++ - 用户模板化定义结构的 QList

标签 c++ qt templates struct qlist

我能否定义一个 QList,使其包含模板化结构的集合,每个结构定义在不同的类型上??

考虑:

template<typename T>struct AA
{
  T value;
}

我可以声明一个 QList 以使其包含不同的 AA 实例吗? 像这样的东西:

struct<int> myIntStruct;
myIntStruct.value = 10;
struct<double> myDobleStruct;
myDoubleStruct = 12.2;

template<typename T>
QList<struct AA<T>> myList;
myList.push_back(myIntStruct);
myList.push_back(myDoubleStruct);

我的意见是 QList 应该包含相同数据类型的实体(即使是模板对象),这就是为什么上述操作是非法的。在那种情况下,我可以在 Qt 中使用什么结构来执行这样的操作??

谢谢,

毗湿奴。

最佳答案

为什么您希望容器具有不同的对象可能是设计缺陷。然而,一些语言支持这一点,例如 Smalltalk,它具有 Bag Collection 的概念,可以包含不同对象类型的混合。 Qt 可能已经有某种包容器类,但我不知道它的存在。

这种在单个容器中混合类型的概念在 C++ 的强类型世界中并不适用。变体对象是最接近的东西,即使没有创建自己的“ super 变体”类,也不是非整数类型,您可以通过子类化 QVariant 来实现。然后添加一些位来处理您的结构。

再次问自己为什么需要此功能?在其他地方实现的更简单的解决方案可能会减轻对此类容器的需求。

编辑:QMap<QString, QVariant> 的快速示例帮助确定这是否可行。

class SomeObject
{
public:
    SomeObject() // default
        : someInt(0), someDouble(0) {}
    SomeObject(int i, double d) // explicit
        : someInt(i), someDouble(d) {}

    int GetSomeInt() const { return someInt; }
    double GetSomeDouble() const { return someDouble; }

private:
    int someInt;
    double someDouble;
};

// must be outside of namespace
Q_DECLARE_METATYPE(SomeObject)

// then you can do stuff like this:
    QMap<QString, QVariant> mapNameToValue;

    // populate map
    mapNameToValue["UserName"] = "User";
    mapNameToValue["Port"] = 10101;
    mapNameToValue["PI"] = 3.14159265;
    mapNameToValue["DateTime"] = QDateTime::currentDateTime();
    QVariant userValue;
    userValue.setValue(SomeObject(5, 34.7));
    mapNameToValue["SomeObject"] = userValue;

    // read from map
    QString userName = mapNameToValue["UserName"].toString();
    unsigned int port = mapNameToValue["Port"].toUInt();
    double PI = mapNameToValue["PI"].toDouble();
    QDateTime date = mapNameToValue["DateTime"].toDateTime();
    SomeObject myObj = mapNameToValue["SomeObject"].value<SomeObject>();

    int someInt = myObj.GetSomeInt();
    double someDouble = myObj.GetSomeDouble();

QVariant处理很多类型它也有模板方法setValuevalue<>对于用户定义的类型。如上所示,您必须使用 Q_DECLARE_METATYPEQMetaType 注册它的宏并在 value<> 的情况下提供默认构造函数转换失败。它不支持某些比较运算符,所以我会制作自己的 QVariant 版本和 QMetaType与任何需要的额外类型一起玩得很好,这样感觉更一致。

关于c++ - 用户模板化定义结构的 QList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505533/

相关文章:

c++ - 使两种类型的相同模板兼容

c++ - 检查输入的类型是否正确

c++ - 我可以从 C++ 访问包含 QtObject 的 QQmlContext 吗?

c - 如何将另一个文件中的函数调用到c中的main函数中?

qt - 如何解决qt slot中函数的二义性

c++ - 自定义 QTableView 网格样式

c++ - 模板和访问者模式

c++ - Qt C++ - 如何获取 QPlainTextEdit 的当前行和列

c++ - 使用 Boost.GIL 将图像转换为 "raw"字节

c++ - 双变量类型输出始终为 0