存储一组不同类型的数组

时间:2012-09-10 15:11:53

标签: c++

感兴趣的是,我可以说我有以下课程:

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>;

在我的商店里。因此,当我迭代时,我按此顺序需要它们。

3 个答案:

答案 0 :(得分: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";
    }
}

答案 1 :(得分:3)

我想你想要boost::any

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

std::map<std::string, any_vector> data;

答案 2 :(得分:-1)

好的,根据最新评论,我建议这样的课程: -

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

其中IPAddress是一个辅助类,用于存储IP地址并以各种方式访问​​它(四个字符,字符串,整数等...)。

我真的不会尝试在两个不同的数据集合(IP地址,所有者名称)上强制使用相同的访问方式。