可以说我有两个模板功能,通过一个容器的遍历:如何将模板名称传递给方法?
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 :: iterator's,我没有看到如何实现这一点。您将需要将容器传递给'GetElement'或从'Next'和'Prev'删除该需求。 –
你还没有定义'期望'是什么。您使用'It'作为'Prev'和'Next'的返回类型类型,但它是未声明的。看起来你打算使用'I'类型。 –
我可能在我的例子中简化了太多,并且暴露了调用者不会意识到的事情。调用者不知道元素如何存储在课堂中。他只知道他可以获取元素的标识符,并且可以调用“GetNextElement”或“GetPrevElement”。由于这两个方法几乎完全相同,我希望能够拥有一个方法,并让调用方指定是否应使用Next或Prev模板函数来获取所需的元素。 – Kian