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

Mey*_*sam 2 c++ comparison templates set

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

属性:有一个类型的成员int(命名mTag)

TypedProperty:从Property类继承并向其添加一个名为mValuetype 的成员T.

对propertyList:一种保持一类std::setProperty,并具有AddPrint方法.

CheckSubset:检查a std::set是否包含在另一个集合中的方法.

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

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

#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)

Sjo*_*erd 5

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

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

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

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

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