C ++如何从模板化派生类中获取成员?

时间:2016-10-10 23:48:38

标签: c++ list templates c++11 derived-class

编辑:这被错误地标记为重复。 C++ class with template member variable有两个答案,但在这种情况下似乎都不够。第一个答案,你必须在调用getter函数时提供模板类型。第二个答案没有提供返回类型。

使用C ++ 11,我需要存储指向列表中对象的指针:

std::list<std::shared_ptr<PropertyGroup> >  _properties;

对象来自模板化的结构类型,所以要做到这一点,我有一个非模板化的基础结构:

struct PropertyGroup
{
    EntityId                    entityId;
    time_point<system_clock>    startTime;
    milliseconds                duration;
    bool                        started;
    bool                        cancelled;

    virtual void*                       GetStartValue() = 0;
    virtual void*                       GetTargetValue() = 0;
    virtual void*                       GetResultValue() = 0;
    virtual std::function<void(void*)>  GetCallback() = 0;
};

一个模板化的派生结构:

template <typename T>
struct TypedPropertyGroup : public PropertyGroup
{
    T                       startValue;
    T                       targetValue;
    T                       resultValue;
    std::function<void(T)>  callback;

    T GetStartValue() override { return &startValue; }
    T GetTargetValue() override { return &startValue; }
    T GetResultValue() override { return &startValue; }
    T GetCallBack() override { return &callback; }
};

TypedPropertyGroup具有类型模板化成员,我在其他地方迭代列表时需要访问它们(startValue,targetValue,resultValue和callback)。

我不确定如何从迭代器访问额外的成员。

std::list<PropertyGroupPtr>::iterator iter = _properties.begin();

while (iter != _properties.end())
{
    std::shared_ptr<PropertyGroup> propertyGroup = *iter;

    // get the value of TypedPropertyGroup::startVale here?

    ++iter;
}

我在其他地方的帖子中看到,为基类添加虚函数是一种访问派生类成员的方法。没有给出示例,我不确定如何在基类中声明虚函数以忽略返回类型。

在上面的例子中,据我所知,在基础结构中返回void *,然后返回指向该值的指针。但这不起作用。

我非常感谢能够在不使用工会或boost :: variant的情况下实现这一目标的任何想法。感谢。

0 个答案:

没有答案