接收迭代器作为参数并知道类

Receive iterators as arguments and know class

本文关键字:参数 迭代器      更新时间:2023-10-16

我需要创建一个方法,该方法接收迭代器作为参数并返回相同类型的模板化集合。

创建了一个最小的例子来证明我的需求:

#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 作为您的方法应该是什么样子的示例。