我正在与以下问题作斗争一段时间:
我的应用程序中有几种数据类型,它们像(非常简化的代码)一样使用:
QVector<Function*> Container::getFunctions() {return mFunctions};
QVector<Procedure*> Container::getProcedures() {return mProcedures};
....
QVector<Function*> mFunctions;
QVector<Procedure*> mProcedures;
Function
和Procedure
都来自具有
ObjectWithUid
virtual QString getClassUid() = 0;
并且Function
和Procedure
都在实现虚方法,并且每个都返回相应的类uid(对于函数,这是"CUID_FUNC"
,对于过程,这是{{1} })。
现在,我在其他地方有一个方法:
"CUID_PROC"
使用如下:
template <class T> void showObjectList(const QVector<T*> items)
{
// show the list of objects
}
或
showObjectList(getFunctions());
正如预期的那样,我可以显示功能或程序。
但是现在我希望能够根据某个对象的类uid显示列表,所以我需要代码如下:
showObjectList(getFunctions());
这里出现问题
我写了以下方法:
ObjectWithUid* obj = giveMeMyObject();
showObjectList(< a vector to which the object belongs determined based on class UID >)
我想尝试使用它:
template <class T> QVector<T*> getListOfObjectsForUid(const QString& uid)
{
if(uid == uidFunction)
{
return getFunctions();
}
return QVector<T*>();
}
并且编译器大喊:ObjectWithUid* obj = giveMeMyObject();
showObjectList(getListOfObjectsForUid(obj->getClassUid()));
我如何实现我正在寻找的目标? IE:基于字符串属性返回不同对象的向量,我可以自动使用它而无需指定类型...
答案 0 :(得分:0)
你必须以某种方式静态指定。
此
showObjectList(getFunctions());
隐式指定T=Function*
,但
showObjectList(getListOfObjectsForUid(obj->getClassUid()));
不明确,因为getListOfObjectsForUid
在返回类型中只有模板参数。
您可以手动解决歧义:
showObjectList(getListOfObjectsForUid<ObjectWithUid>(obj->getClassUid()));
由于所有对象类型都从ObjectWithUid
继承而且返回类型实际上是QVector<ObjectWithUid*>
而不仅仅是QVector<ObjectWithUid>
。