用于将QVariant转换为{自定义类型的c ++函数指针

时间:2012-10-27 01:03:54

标签: c++ qt templates

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没有名为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;
}

这是一个follow-up question to a previous question这个问题和这个问题之间的区别是T是'MyClass'或'MyClass2',而不是通常由QVariant持有的类型。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,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;
}