作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑这两个函数,它们适用于 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/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!