0

興味深いことに、私が次のクラスを持っているとしましょう。

class Data
{
public:
    template<class T>
    std::vector<T> getData(std::string& dataName);
private:
    ...
}:

したがって、クラスは任意のタイプのベクトルのセットを格納します。各ベクトルには名前があり、取得するときにそのタイプがわかります。このデータをDataクラス内に格納するためにどのコンテナを使用できますか?std::vector<std::pair<std::string,std::vector<T>>>?_

更新

また、このクラスを繰り返す必要があり、アイテムは追加したのと同じ順序である必要があります。

たとえば、次のようになります。

ownerNames: std::vector<std::string>;
ipAddress: std::vector<char>;

私の店で。したがって、反復するときは、この順序でそれらが必要です。

4

3 に答える 3

3

検索時にタイプがわかっている場合は、:を使用しますboost::any

struct Data
{
    std::map<std::string, boost::any> store;

    template <typename T>
    std::vector<T> & get(std::string const & s)
    {
        boost::any & a = store.find(s)->second;       // check existence!
        return boost::any_cast<std::vector<T> &>(a);  // try/catch bad cast!
    }

    template <typename T>
    bool put(std::string const & s, std::vector<T> v)
    {
        return store.emplace(s, std::move(v)).second;
    }
};

使用法:

void f(Data & d)
{
    try
    {
        auto & v = d.get<int>("MyNumbers");
    }
    catch (boost::bad_any_cast const & e)
    {
        std::cout << "'MyNumbers' is not an int-vector.\n";
    }
}
于 2012-09-10T15:16:10.023 に答える
3

私はあなたが欲しいと思いますboost::any

typedef std::vector<boost::any> any_vector;

std::map<std::string, any_vector> data;
于 2012-09-10T15:16:12.007 に答える
-1

OK、最新のコメントに基づいて、次のようなクラスを提案します:-

class Server
{
public:
  const IPAddress GetIPAddress ();
  vector <std::string> &GetOwners ();
};

whereIPAddressは、IP アドレスを保存し、さまざまな方法 (4 文字、文字列、整数など) でアクセスするためのヘルパー クラスです。

2 つの異なるデータ コレクション (IP アドレス、所有者名) に同じアクセス スタイルを強制するつもりはありません。

于 2012-09-10T15:45:23.943 に答える