gpt4 book ai didi

c++ - 如何将迭代器泛化为特定类型

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:51 26 4
gpt4 key购买 nike

考虑这两个函数,它们适用于 std::vector:

  int connectNode(GraphNode const& newNode,std::vector<GraphNode const*>::const_iterator beginCandidates, std::vector<GraphNode const*>::const_iterator endCandidates){
int connections =0;
for (auto iter= beginCandidates; iter!= endCandidates; ++iter) {
if(connectNodes(newNode,**iter)) ++connections;
}
return connections;
}

int connectNode(GraphNode const& newNode,std::vector<GraphNode>::const_iterator beginCandidates, std::vector<GraphNode>::const_iterator endCandidates){
int connections =0;
for (auto iter= beginCandidates; iter!= endCandidates; ++iter) {
if(connectNodes(newNode,*iter)) ++connections;
}
return connections;
}

这些函数适用于 vector ,但显然不适用于任何其他容器,例如一套。他们怎么能被概括。我能想到的唯一可能的解决方案是使用一些非常难看的 enable_if 解决方法。有直接的解决方案吗?编辑:为了更清楚:我想要两个函数,一个用于普通容器,一个用于指针容器。真正的逻辑发生在 connetNodes 内部,它需要两个引用。 (注意第一个函数中的**)

最佳答案

如前所述,使迭代器类型成为模板参数——这解决了泛化迭代器本身的问题。为了区分正常的 GraphNode 值和它们的指针,您可以只使用重载:

template<class T>
T& maybe_deref(T& v){ return v; }

template<class T>
T& maybe_deref(T* p){ return *p; }

只需在 connectNodes(newNode, maybe_deref(*iter)) 中调用即可。

关于c++ - 如何将迭代器泛化为特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com