【发布时间】:2017-04-20 07:14:31
【问题描述】:
假设我有两个用于迭代容器的模板函数:
template <typename I, typename C>
It Prev(I i, const C& c) noexcept {
Expects(i != c.end());
if (i == c.begin()) return c.end();
return i - 1;
}
和
template <typename I, typename C>
It Next(I i, const C& c) noexcept {
Expects(i != c.end());
return i + 1;
}
还有一个使用这些模板的具有 GetNextElement 和 GetPrevElement 的类:
struct MyClass {
std::vector<int> elements;
int* GetNextElement(std::vector<int>::iterator i) {
auto next = Next(i, elements);
if (next == elements.end()) return nullptr;
return &*it;
}
int* GetPrevElement(std::vector<int>::iterator i) {
auto prev = Prev(i, elements);
if (prev == elements.end()) return nullptr;
return &*it;
}
};
这两个方法做同样的事情,除了调用不同的模板。如何将这些转换为单个成员函数,可以像
一样调用MyClass mc;
// ...
auto it = mc.elements.begin();
auto next = mc.GetElement<Next>(it);
// Or maybe mc.GetElement(it, Next);
【问题讨论】:
-
Next和Prev期望引用与迭代器关联的容器。GetElement不知道该容器。由于您似乎在使用std::vector::iterators,我不知道如何实现这一点。您要么需要将容器传递给GetElement,要么从Next和Prev中删除该要求。 -
您还没有定义
Expects是什么。您使用It作为Prev和Next的返回类型类型,但它是未声明的。看起来您打算使用I类型。 -
我可能在我的示例中简化了太多并且暴露了调用者不知道的事情。调用者不知道元素是如何存储在类中的。他只知道他可以得到一个元素的标识符,并且假设他可以调用“GetNextElement”或“GetPrevElement”。由于这两种方法几乎完全相同,我希望能够有一个方法并让调用者指定它是否应该使用 Next 或 Prev 模板函数来获取所需的元素。