我有一个看起来像这样的课程。我更喜欢在Parent类中使用ParentMef的typedef并将其重命名为Member。怎么可能这样呢?我能看到的唯一方法是将std :: vector作为公共成员而不是使用继承。
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
{
...
};
};
答案 0 :(得分:2)
我能看到的唯一方法是将std :: vector作为公共成员而不是使用继承。
是的......那是正确的方式。
现在让我们假设有问题的课程不是 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;