C 功能指针用于将QVariant转换为{自定义类型

c++ function pointer used to convert a QVariant to {a custom type

本文关键字:自定义 类型 转换 QVariant 功能 指针 用于      更新时间:2023-10-16

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没有成员命名condfunct'

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;
}

这是上一个问题的后续问题。/div>

如果我正确理解您的问题,则convFunct应该是获得QVariant并返回MyClassMyClass2实例的函数,是否正确?如果您的答案是肯定的,则此功能应获得类型QVariant的参数,并且您的功能没有参数,因此结果是:

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;
}