我正在寻找有关我要编写的功能的帮助。 目的是获取已加载到向量中的各种数据结构的所有迭代器。
例如:
std::vector<std::unique_ptr<XXXX<std::string>>>
其中XXXX是为其获取迭代器的结构。
真实的例子
std::vector<std::unique_ptr<std::multiset<std::string>>>
std::vector<std::unique_ptr<custom_list<std::string>>>
std::vector<std::unique_ptr<custom_tree<std::string>>>
已编辑:删除了错字
下面是我当前编写的代码,但是它非常复杂,并且不能正确编译
template <typename L, typename V>
bool get_iterators(L to_sort, V all_iterator)
{
for (auto &&pointer : *(to_sort))
{
if (typeid(pointer) == typeid
(std::unique_ptr<std::multiset<std::string>>))
{
all_iterator->push_back(pointer->begin());
}
else
{
return false;
}
}
return true;
}
和
template <typename T>
void merge_sort(T &to_sort)
{
if (typeid(to_sort) == typeid(std::vector<std::unique_ptr<std::multiset<std::string>>>))
{
std::vector<std::multiset<std::string>::iterator> all_iterator;
get_iterators(&to_sort, &all_iterator);
}
else
{
...
}
}
扩展代码也可以执行
if (typeid(pointer) == typeid(std::unique_ptr<std::XXXX<std::string>>))
这似乎非常不必要。另外,当我添加这些额外的检查时,我得到编译错误,提示找不到有效的函数。
如上所述,目的是获取各种数据结构的所有迭代器。
答案 0 :(得分:0)
这是简单的模板答案:
template<class V>
auto get_iterators(V &v) {
std::vector<decltype(v.front()->begin())> ret;
for(auto &u : v)
ret.push_back(u->begin());
return ret;
}
通过按值返回,简化了客户端:
auto iters=get_iterators(to_sort);
很容易避免使用迭代器重复实际的算法。