1

我有一个看起来像这样的课程。我希望在 Parent 类中有 ParentMember 的 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
    {
      ...
    };
};
4

1 回答 1

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_typetypedef,这将允许您确保两者永远不会不同:

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

如果您的Parent课程本身就是一个模板,您将需要

typedef typename Parent::value_type Member;
于 2012-09-13T15:42:51.983 回答