0

参考这个答案,第二个代码块。我的问题是:

如果我知道我将只处理std::lists<int>,而且只处理<int>。有没有办法在不使用模板并且不按照评论中的建议通过引用传递列表的情况下编写这个(第二个块和第三个块)?你能给我看看吗?

如果实现只涵盖一种类型,我认为避免使用模板是有意义的吗???(还是我太懒了?)

4

1 回答 1

4

这就是我的答案!

您可以将 a 传递std::back_insert_iterator<std::list<int> >给带有或不带有模板的函数。秘密地,您仍然通过引用传递列表,因为迭代器本身持有指向容器的引用或指针。

typedef std::back_insert_iterator<std::list<int> > OutputIterator;

void getInts(OutputIterator out) {
    for (int i = 0; i < 10; ++i) {
        *(out++) = i;
    }
}

然后调用者执行:

std::list<int> l;
getInts(std::back_inserter(l));

back_inserter在函数模板和类模板的意义上,您仍然在“使用模板” back_insert_iterator,但同样如此list。这样您就不会编写自己的任何模板。

我不同意,如果您只对一种类型感兴趣,那么避免使用模板必然是有意义的——C++ 模板的副作用是通过模板参数推导进行类型推断,这意味着您不必写出荒谬的类型,例如std::back_insert_iterator<std::list<int> >,甚至在 typedef 中一次。从代码中可以看出,避免模板并不是懒惰,实际上编写模板的文本更少,因为您不必提及类型。但是,如果出于某种原因,您想不遗余力地将该功能限制为仅适用于列表,并且只能附加到列表的后面,那么您可以继续。

于 2011-07-15T12:39:25.253 回答