Mey*_*sam 2 c++ comparison templates set
所以,我有以下类和方法:
属性:有一个类型的成员int(命名mTag)
TypedProperty:从Property类继承并向其添加一个名为mValuetype 的成员T.
对propertyList:一种保持一类std::set的Property,并具有Add与Print方法.
CheckSubset:检查a std::set是否包含在另一个集合中的方法.
我不知道应该如何实现这个CheckSubset方法.因为我不知道如何遍历set<Property>和访问模板成员(mValue).我也尝试使用这种includes方法,但是没有用(即使它有效,我也不知道它是怎么做的!).该方法存在同样的问题PropertyList::Print,我不知道应该使用什么样的演员表.
任何有关实施CheckSubset和Print方法的建议将不胜感激!
更新的源代码(使用指针)
#include <string>
#include <iostream>
#include <set>
#include <algorithm>
#include <tr1/memory>
using namespace std;
/////////////////// Property Class //////////////////////
class Property
{
public:
Property(){};
Property(const int tag)
: mTag(tag) {}
virtual ~Property() {}
int mTag;
bool operator<(const Property &property) const
{
return mTag < property.mTag;
}
};
/////////////////// TypedProperty Class /////////////////
template< typename T >
class TypedProperty : public Property
{
public:
TypedProperty (const int tag, const T& value)
: Property(tag), mValue(value){}
T mValue;
};
/////////////////////////////////////////////////////////
typedef std::tr1::shared_ptr<Property> PropertyPtr;
/////////////////// PropertyList Class /////////////////
class PropertyList
{
public:
PropertyList(){};
virtual ~PropertyList(){};
template <class T>
void Add(int tag, T value)
{
PropertyPtr ptr(new TypedProperty<T>(tag, value));
mProperties.insert(ptr);
}
void Print()
{
for(set<PropertyPtr>::iterator itr = mProperties.begin(); itr != mProperties.end(); itr++)
{
cout << ((PropertyPtr)*itr)->mTag << endl;
// What should I do to print mValue? I do not know its type
// what should *itr be cast to?
}
}
set<PropertyPtr> mProperties;
};
//////////////////// Check Subset ///////////////////////
/*
* Checks if subset is included in superset
*/
bool CheckSubset(set<PropertyPtr> &superset, set<PropertyPtr> &subset)
{
// How can I iterate over superset and subset values while I do not know
// the type of mValue inside each Property?
// I also tried the following method which does not seem to work correctly
return includes(superset.begin(), superset.end(),
subset.begin(), subset.end());
}
int main()
{
PropertyList properties1;
properties1.Add(1, "hello");
properties1.Add(2, 12);
properties1.Add(3, 34);
properties1.Add(4, "bye");
properties1.Print();
PropertyList properties2;
properties2.Add(1, "hello");
properties2.Add(3, 34);
if(CheckSubset(properties1.mProperties, properties2.mProperties)) // should be true
cout << "properties2 is subset!" << endl;
PropertyList properties3;
properties3.Add(1, "hello");
properties3.Add(4, 1234);
if(CheckSubset(properties1.mProperties, properties3.mProperties)) // should be false
cout << "properties3 is subset!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
你想要什么,不能用当前的设计来完成.
你的方法失败了std::set<Property>.
std::set<Property>会切片.这意味着它只会复制Property部件并忘记复制其他TypedProperty<T>成员.
因此,在内部PropertyList::print(),无法访问mValue.
如果要将TypedProperty<T>s 存储在a中std::set,则必须使用某种指针.即std::set<Property*>,或智能指针版本.