编辑:这被错误地标记为重复。 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的情况下实现这一目标的任何想法。感谢。