如何遍历类的实例集合并访问其模板成员

时间:2012-10-29 12:24:30

标签: c++ templates comparison set

所以,我有以下类和方法:

属性:拥有int类型的单个成员(名为mTag

TypedProperty :继承Property类,并向其添加名为mValue的{​​{1}}成员。

PropertyList :维护T std::set且具有PropertyAdd方法的类。

CheckSubset :检查另一组中是否包含Print的方法。

我不知道应该如何实现std::set方法。因为我不知道如何遍历CheckSubset并访问模板成员(set<Property>)。我也尝试使用mValue方法,它不起作用(即使它有效,我也不知道它是怎么做的!)。 includes方法存在同样的问题,我不知道应该使用什么演员表 任何有关PropertyList::PrintCheckSubset方法实施的建议都将不胜感激!

更新了源代码(使用指针)

Print

2 个答案:

答案 0 :(得分:5)

你想要什么,不能用当前的设计来完成。

您的方法失败了std::set<Property>

std::set<Property>会切片。这意味着它只会复制Property部分而忘记复制其他TypedProperty<T>成员。

因此,在PropertyList::print()内,无法访问mValue。

如果要将TypedProperty<T>存储在std::set中,则必须使用某种指针。即std::set<Property*>或智能指针版本。

答案 1 :(得分:1)

要解决Print PropertyList方法中的问题,您可以为Print类编写TypedProperty方法,该方法会打印其标记和值。

但是关于访问mValue你想要进行某些操作的问题,我想不出使用普通类型和模板来获取mValue而不参与你的父类的方法{模板类型为Property的{​​1}}(看起来不合适)。但是您可以获取TypedProperty的地址并将其转换为mValue以消除类型问题。这样您将面临另一个问题,即您无法指向void*指针的值,因此您无法在父级别使用指针。因此,您应该编写一个方法(由void*实现),该方法接受TypedProperty指针并将其强制转换为子中定义的类型并执行所需的操作。

例如,在以下代码中,我假设您要检查void*中值与另一个相同类型(TypedProperty方法)的相等性。

现在您可以使用IsEqual简单地实现CheckSubset(检查两个元素就像:IsEqual)。

superItr->IsEqual(subItr->GetValue())