所以,我有以下类和方法:
属性:拥有int
类型的单个成员(名为mTag
)
TypedProperty :继承Property
类,并向其添加名为mValue
的{{1}}成员。
PropertyList :维护T
std::set
且具有Property
和Add
方法的类。
CheckSubset :检查另一组中是否包含Print
的方法。
我不知道应该如何实现std::set
方法。因为我不知道如何遍历CheckSubset
并访问模板成员(set<Property>
)。我也尝试使用mValue
方法,它不起作用(即使它有效,我也不知道它是怎么做的!)。 includes
方法存在同样的问题,我不知道应该使用什么演员表
任何有关PropertyList::Print
和CheckSubset
方法实施的建议都将不胜感激!
更新了源代码(使用指针)
Print
答案 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())