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持有的类型。
答案 0 :(得分:2)
如果我正确理解您的问题,convFunct
应该是一个获得QVariant
并返回MyClass
或MyClass2
实例的函数,这是正确的吗?如果你的答案是肯定的,那么这个函数应该得到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;
}