0

QVariant 持有一个 QMap 对象,该对象将被转换为自定义类型,MyClass 或 MyClass2。

例子:

class MyClass{
   int item1;
   int item2;
   QString string1;
   AnotherClass subclass;
};

class MyClass2{
   int item1;
   QString string1;
   AnotherClass subclass;
};

已编写函数将 QVariant 转换为关联的类

MyClass QVariantToMyClass1(QVariant);
MyClass2 QVariantToMyClass1(QVariant);

我的问题是,在模板函数中,传递函数指针的正确方法是什么?下面显示的代码返回错误'const class QVariant has no member named convFunct'

template<class T>
QList<T> QVariantToQList(QVariant & qv,T (* convFunct)() )
{
    // Create the list that will hold the return values
    QList<T> qListOfMembers;
    if(qv.typeName() == "QVariantMap"){
        foreach(QVariant const& mapMember,qv.toMap())
        {
            qListOfMembers.append(mapMember.convFunct());
        }
    }
    else if (qv.typeName() == "QVariantList"){
        foreach(QVariant const& listMember,qv.toList())
        {
            qListOfMembers.append(listMember.convFunct());
        }
    }
    else
    {
        qDebug()<< "QVariantToQList currently is implemented only for QMap and QList types";
        throw ;
    }
    return qListOfMembers;
}

这是上一个问题的后续问题 该问题与此问题之间的区别在于 T 是“MyClass”或“MyClass2”,而不是通常由 QVariant 持有的类型。

4

1 回答 1

2

如果我正确理解您的问题,convFunct应该是一个获取 a并返回orQVariant实例的函数,是否正确?如果你的答案是肯定的,那么这个函数应该得到一个类型的参数并且你的函数没有参数,所以结果是:MyClassMyClass2QVariant

template<class T>
QList<T> QVariantToQList(QVariant & qv,T (*convFunct)(QVariant const&) )
{
    // Create the list that will hold the return values
    QList<T> qListOfMembers;
    if(qv.typeName() == "QVariantMap"){
        foreach(QVariant const& mapMember,qv.toMap())
        {
            qListOfMembers.append(convFunct(mapMember));
        }
    }
    else if (qv.typeName() == "QVariantList"){
        foreach(QVariant const& listMember,qv.toList())
        {
            qListOfMembers.append(convFunct(listMember));
        }
    }
    else
    {
        qDebug()<< "QVariantToQList currently is implemented only for QMap and QList types";
        throw ;
    }
    return qListOfMembers;
}
于 2012-10-27T01:21:19.117 回答