我想要一个模板来返回不同的类

时间:2017-08-28 16:28:34

标签: c++ openframeworks

长期读者,

我想知道是否有人可以通过使用模板返回从同一个基础派生的不同类来帮助我使代码更简单一些。所以我可以调用类上的函数,而不是在manager类中为每个对象调用重写函数。这是我当前函数调用的示例:

void setLoopImage(AnimationManagerIndex & managerIndex, bool b)
{
    switch (managerIndex.animationClass)
    {
        case ANIMATION_CLASS_BASE:
        {
            vAnimationObjectBase[managerIndex.index].setLoopImage(b);
            break;
        }
        case ANIMATION_CLASS_MOVING:
        {
            vAnimationObjectMoving[managerIndex.index].setLoopImage(b);
            break;
        }
        case ANIMATION_CLASS_MOVING_BEZIER:
        {
            vAnimationObjectMovingBezier[managerIndex.index].setLoopImage(b);
            break;
        }
    }
}

我想创建一个模板函数,它返回这些类:

template<class T>
T & getAnimationObject(AnimationManagerIndex & managerIndex)
{
    switch (managerIndex.animationClass)
    {
        case ANIMATION_CLASS_BASE:
        {
            return vAnimationObjectBase[managerIndex.index];
        }
        case ANIMATION_CLASS_MOVING:
        {
            return vAnimationObjectMoving[managerIndex.index];
        }
        case ANIMATION_CLASS_MOVING_BEZIER:
        {
            return vAnimationObjectMovingBezier[managerIndex.index];
        }
    }
}

所以第一个函数将成为:

void setLoopImage(AnimationManagerIndex & managerIndex, bool b)
{
    getAnimationObject(managerIndex).setLoopImage(b);
}

2 个答案:

答案 0 :(得分:1)

您不需要模板。您可以通过创建一个定义(纯)虚拟setLoopImage函数的基(抽象)类来实现此目的。

class Base
{
    virtual setLoopImage(bool b) = 0;
}; 

从上面的类中派生以下每个类:vAnimationObjectBase,vAnimationObjectMoving和vAnimationObjectMovingBezier。

然后你的getAnimationObject函数将返回Base&amp;:

Base& getAnimationObject(AnimationManagerIndex & managerIndex)
{
    switch (managerIndex.animationClass)
    {
        case ANIMATION_CLASS_BASE:
        {
            return vAnimationObjectBase[managerIndex.index];
        }
        case ANIMATION_CLASS_MOVING:
        {
            return vAnimationObjectMoving[managerIndex.index];
        }
        case ANIMATION_CLASS_MOVING_BEZIER:
        {
            return vAnimationObjectMovingBezier[managerIndex.index];
        }
    }
}

每个派生类都将实现纯虚拟setLoopImage函数,您将在派生类上调用它。

答案 1 :(得分:1)

这个问题的通常解决方案是经典继承:

struct drawable_interface {
    virtual void setLoopImage(bool) = 0;
};

drawable_interface & getAnimationObject(AnimationManagerIndex & managerIndex) {
    /*Same code as before*/
}