c ++方法基于字符串返回不同的类型

时间:2013-09-25 08:59:43

标签: c++ templates return

我正在与以下问题作斗争一段时间:

我的应用程序中有几种数据类型,它们像(非常简化的代码)一样使用:

QVector<Function*> Container::getFunctions() {return mFunctions};
QVector<Procedure*> Container::getProcedures() {return mProcedures};
....
QVector<Function*> mFunctions;
QVector<Procedure*> mProcedures;

FunctionProcedure都来自具有

的班级ObjectWithUid
virtual QString getClassUid() = 0;

并且FunctionProcedure都在实现虚方法,并且每个都返回相应的类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:基于字符串属性返回不同对象的向量,我可以自动使用它而无需指定类型...

1 个答案:

答案 0 :(得分:0)

你必须以某种方式静态指定。

  showObjectList(getFunctions());

隐式指定T=Function*,但

  showObjectList(getListOfObjectsForUid(obj->getClassUid()));

不明确,因为getListOfObjectsForUid在返回类型中只有模板参数。

您可以手动解决歧义:

  showObjectList(getListOfObjectsForUid<ObjectWithUid>(obj->getClassUid()));

由于所有对象类型都从ObjectWithUid继承而且返回类型实际上是QVector<ObjectWithUid*>而不仅仅是QVector<ObjectWithUid>