2012-09-13 79 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;