感兴趣的是,我可以说我有以下课程:
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>;
在我的商店里。因此,当我迭代时,我按此顺序需要它们。
答案 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地址,所有者名称)上强制使用相同的访问方式。