我知道以前有人问过这样的问题,但我仍在努力寻找答案。
我正在尝试返回一种map
string
和vector
的方法;我有两个向量std::vector<Eigen::MatrixXd> samples
和std::vector<std::string> sample_names
这是我到目前为止所做的:
std::map<std::string, std::vector> FileReader::get_data() {
std::map<std::string, std::vector> content;
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> sample_names;
for (auto i : list_dir()) {
if (contains_number(i)) {
samples.push_back(load_csv(location + "/" + i));
sample_names.push_back(i);
}
}
content["samples"] = samples;
content["sample_names"] = sample_names;
return content;
}
显然,我收到一个错误
error: type/value mismatch at argument 2 in template parameter list for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
std::map<std::string, std::vector> get_data(void);
因为我在方法中没有用于vector
的数据类型。如果我加上string
或Eigen::MatrixXd
它们就不能齐头并进。我知道我可以使用boost::any
但它将是一个需要编译的额外库(?(,并且C++不是动态类型的。
有什么方法可以通过没有额外的库来做到这一点吗?
更新-1:
我认为我可以做的另一种方法是在构造函数中有一个私有变量vector<Eigen::MatriXd> samples
&vector<std::string> smaple_names
并创建两个相同向量类型的方法get_samples()
和get_sample_names()
然后使用this->samples = samples
和this->sample_name
之类的东西。这是唯一的其他方法吗?
更新-2:
看起来std::any
是在 C++17 - http://en.cppreference.com/w/cpp/header/any。如果any
一个:p感兴趣。
更新-3:
如果有人正在寻找答案,它就在
https://stackoverflow.com/a/44896365/3782963
我同意std::any
(或boost::any
(对于这种情况来说有点矫枉过正。std::variant
(或boost::variant
(在这里会是更好的选择,因为您确切地知道要存储的 2 种类型。
如果您不想使用任何其他库(如 Boost(并且无法访问 C++17,您可以尝试在虚拟实现中模拟自己std::variant
(如果您不能/不想编写完整的(。像这样:
struct data {
// constructors...
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> names;
int index = -1;
};
然后,您可以将数据存储在std::map<std::string, data>
中:
std::map<std::string, data> content;
content.emplace(std::make_pair("samples", data{samples, 0}));
content.emplace(std::make_pair("sample_names", data{sample_names, 1}));
然后,您只需要检查索引即可知道必须使用哪个std::vector
。
为什么要使用地图?您可以改用std::pair<std::vector<std::string>, std::vector<Eigen::MatrixXd>>
。
以下是该函数的外观:
std::pair<std::vector<std::string>, std::vector<Eigen::MatrixXd>> FileReader::get_data()
{
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> sample_names;
for (auto i : list_dir()) {
if (contains_number(i)) {
samples.push_back(load_csv(location + "/" + i));
sample_names.push_back(i);
}
}
return std::make_pair(sample_names, samples);
}
如果您使用的是 C++11,则可以将 return 语句替换为
return {sample_names, samples};