gpt4 book ai didi

C++ 返回多个项目

转载 作者:太空宇宙 更新时间:2023-11-04 16:25:16 24 4
gpt4 key购买 nike

我正在用 C++ 设计一个从 HTML 页面中提取 URL 的类。我正在使用 Boost 的 Regex 库来为我完成繁重的工作。我开始设计一个类并意识到我不想限制 URL 的存储方式。一种选择是接受 std::vector<Url>通过引用,只需调用 push_back 就可以了。我想避免强制我类(class)的消费者使用 std::vector .因此,我创建了一个采用目标迭代器的成员模板。它看起来像这样:

template <typename TForwardIterator, typename TOutputIterator>
TOutputIterator UrlExtractor::get_urls(
TForwardIterator begin,
TForwardIterator end,
TOutputIterator dest);

我觉得我把事情复杂化了。我喜欢用 C++ 编写相当通用的代码,而且我努力锁定我的接口(interface)。但后来我陷入了这些困境,我试图将一切模板化。此时,阅读代码的人并没有意识到 TForwardIterator正在遍历 std::string .

在我的特殊情况下,我想知道这种通用性是否是一件好事。您从什么时候开始使代码更明确?是否有一种标准方法可以从函数中通用地获取值?

最佳答案

是的,它不仅很好,而且是一个非常好的设计。大多数标准库算法都是这样进行模板化的,例如 std::fillstd::copy;它们被设计成与迭代器一起工作,这样你就可以填充一个已经有元素的容器,或者你可以使用一个空容器并使用 std::back_inserter 填充数据

这是一个非常好的设计 IMO,并利用了模板和迭代器概念的强大功能。

你可以像这样使用它(但你已经知道了):

std::list<Url> l;
std::vector<Url> v;

x.get_urls(begin(dat1), end(dat1), std::back_inserter(l));
y.get_urls(begin(dat2), end(dat2), std::back_inserter(v));

我的感觉是您害怕使用模板,它们不是“正常”的 C++,或者它们应该被避免并且过于臃肿等等。我向你保证,它们是非常正常的,并且是其他语言(我所知道的)所没有的强大的语言特性,所以只要适合使用它们,就使用它们。而在这里,它是非常合适的。

关于C++ 返回多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com