【发布时间】:2012-09-25 15:20:58
【问题描述】:
我正在用 C++ 设计一个从 HTML 页面中提取 URL 的类。我正在使用 Boost 的 Regex 库为我完成繁重的工作。我开始设计一个类,并意识到我不想束缚 URL 的存储方式。一种选择是通过引用接受 std::vector<Url> 并在其上调用 push_back。我想避免强迫我班的消费者使用std::vector。因此,我创建了一个带有目标迭代器的成员模板。它看起来像这样:
template <typename TForwardIterator, typename TOutputIterator>
TOutputIterator UrlExtractor::get_urls(
TForwardIterator begin,
TForwardIterator end,
TOutputIterator dest);
我觉得我把事情复杂化了。我喜欢用 C++ 编写相当通用的代码,但我很难锁定我的接口。但后来我陷入了这些困境,我试图将一切模板化。此时,阅读代码的人并没有意识到 TForwardIterator 正在迭代 std::string。
在我的特殊情况下,我想知道这种通用性是否是一件好事。你什么时候开始让代码更明确?是否有一种标准方法可以从函数中获取值?
【问题讨论】:
-
首先,您应该考虑使用现有库正确解析 HTML:stackoverflow.com/questions/489522/…
-
关于不将用户绑定到特定容器,您的设计很好,因为您可以使用
back_inserter作为第三个参数并且与容器无关。这就是许多标准库算法的工作原理。 -
我真的不需要解析 HTML。我只需要检测锚标签中的
hrefs。 -
HTML 过于复杂,无法支持正则表达式解析。任何半复杂的页面都会有脚本标签(或另外十几个标签中的一个),一旦进入那里,一切都会变得很糟糕。您需要使用专门设计用于处理 html 的 SAX 解析器(尤其是所有错误信息的页面(占大多数))。这里描述了一种让你滚动的简单技术:stackoverflow.com/a/11820174/14065
标签: c++ iterator return-value