【发布时间】:2012-04-08 15:48:16
【问题描述】:
说我需要使用s:
typedef struct tagSOMESTRUCT // Defined by someone else; C-compatible
{
int count;
int elements[256];
} SOMESTRUCT;
SOMESTRUCT s;
说我有这样的功能:
template<typename RevFwdIt>
std::pair<RevFwdIt, RevFwdIt> some_slice_rev(RevFwdIt rbegin, RevFwdIt rend)
{
RevFwdIt it = basename_rev(rbegin, rend);
RevFwdIt e = std::find(rbegin, it, 5);
return std::make_pair(e == it ? rbegin : e, it);
}
为了使用这个功能,我需要说
some_slice_rev(&s.elements[s.count - 1], &s.elements[-1]);
哪一个(恕我直言)是丑陋且容易出错的,因为存在非一个错误。
一方面,我不能简单地将some_slice_rev 更改为some_slice 以使用(更好)
some_slice(&s.elements[0], &s.elements[s.count]);
因为std::find 会从头而不是尾搜索。
另一方面,代码本身在我看来已经损坏,因为我看不出std::find 将如何处理作为原始指针的“反向迭代器”。
在这种情况下修复代码的最佳方法是什么?有没有办法使用作为原始指针的反向迭代器?或者,除了更改SOMESTRUCT,其他是否有解决此问题的标准重构机制?
【问题讨论】:
标签: c++ pointers iterator find