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

typedef1つの解決策は、基本クラスに非バージョンを使用してから、それを使用する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として公開することもできます。これにより、2つが決して異ならないようにすることができます。

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

Parentクラス自体がテンプレートである場合は、

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