我需要创建一个方法,该方法接收迭代器作为参数并返回相同类型的模板化集合。
我创建了一个最小的例子来证明我的需求:
#include <list>
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int _i) : i(_i) {}
operator int() {
return i;
}
};
class B {
int i;
public:
B(int _i) : i(_i) {}
operator int() {
return i;
}
};
template <class T>
list<T> method(typename list<T>::iterator begin, typename list<T>::iterator end) {
list<T> res; // I need the template class here
for (; begin != end; begin++) {
cout << *begin; // Whatever...
}
return res;
}
int main() {
list<A> listA = {1, 2, 3};
list<B> listB = {4, 5, 6};
auto res1 = method(listA.begin(), listA.end()); // Cannot change
auto res2 = method(listB.begin(), listB.end()); // Cannot change
}
这不是一个工作示例,但我正在寻找一种方法来使其工作。
重要的部分是method
及其参数,它将返回一个带有T
的模板化类。所以我可以随心所欲地更改方法,但auto res1 = method(listA.begin(), listA.end());
应该保持不变。(不是我的代码(
我怎么能做这样的事情?
在这种特殊情况下(如果你知道它是std::list
(,你可以从迭代器本身获得value_type
:
template <class T>
auto method(T begin, T end) {
list<typename T::value_type> res; // I need the template class here
for (; begin != end; begin++) {
cout << *begin; // Whatever...
}
return res;
}
value_type = U
仅适用于std::list<U>
typename list<T>::iterator
是一个非推导的上下文。需要传递容器本身或将其指定为显式模板参数。
迭代器指定一个序列;它们不必与"集合"相关联。例如,您可以创建一个从控制台读取输入的迭代器。
如果要将函数限制为仅使用容器,请按此编写:
template <class T>
T f(const T& container) {
// whatever; code that uses begin() and end()?
}
这是不可能的。可以拥有不对应于任何容器的迭代器。 调用方法的函数应创建一个空列表,并将back_inserter传递给该列表作为方法的第三个参数。使用 std:copy 作为您的方法应该是什么样子的示例。