2012-09-13 41 views
0

我有一个类似这样的类。我更喜欢在Parent类中获得ParentDeb的typedef并将其重命名为Member。这怎么可能?我能看到的唯一方法是将std :: vector作为公共成员,而不是使用继承。在父类中包含儿童的typedef

typedef std::pair<std::string, boost::any> ParentMember; 
class Parent: public std::vector<ParentMember> 
{ 
public: 
    template <typename T> 
    std::vector<T>& getMember(std::string& s) 
    { 
     MemberFinder finder(s); 
     std::vector<ParentMember>::iterator member = std::find_if(begin(), end(), finder); 
     boost::any& container = member->second; 
     return boost::any_cast<std::vector<T>&>(container); 
    } 
private: 
    class Finder 
    { 
     ... 
    }; 
}; 
+2

你[不应从公开的std ::向量继承(http://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector)。 – juanchopanza

+0

@juanchopanza'其实,std :: vector的公有继承没有任何问题。如果你需要这个,就这样做。“所以......为什么不呢?你不应该使用多态,因为向量没有虚拟角色,但是从向量继承是可以的。 – ForEveR

+0

你还可以提供一个可以使用你的类(和Parent :: Member类型)的代码吗? – UnknownGosu

回答

1

我能看到的唯一方法是有标准::向量作为公共成员,而不是使用继承。

是的......这是正确的方式™。

现在让我们假设有问题的课程是而不是std::vector但是其他的东西,这将使这是一个合法的问题。

一种解决方案是使用非typedef版为基类,然后typedef

class Parent 
    : public std::vector<std::pair<std::string, boost::any>> 
{ 
public: 
    typedef std::pair<std::string, boost::any> Member; 
    // ... 
}; 

std::vector作为基类的情况下,它甚至暴露类型为嵌套value_type的typedef,这将允许您以确保这两个是不同的永不:

typedef value_type Member; // value_type inherited from std::vector 

如果您Parent类是一个模板本身,则需要

typedef typename Parent::value_type Member;