C++;返回多个项目 我设计C++中的一个类,它从HTML页面中提取URL。我正在使用Boost的正则表达式库为我做繁重的工作。我开始设计一个类,并意识到我不想限制URL的存储方式。一种选择是通过引用接受一个std::vector,只需调用push_就可以了。我希望避免强迫我的类的消费者使用std::vector。因此,我创建了一个成员模板,该模板使用目标迭代器。看起来是这样的: template <typename TForwardIterator, typename TOutputIterator> TOutputIterator UrlExtractor::get_urls( TForwardIterator begin, TForwardIterator end, TOutputIterator dest); 模板 ToutPutiator UrlExtractor::获取URL( t前进迭代器开始, t前进迭代器结束, Toutputiator dest);

C++;返回多个项目 我设计C++中的一个类,它从HTML页面中提取URL。我正在使用Boost的正则表达式库为我做繁重的工作。我开始设计一个类,并意识到我不想限制URL的存储方式。一种选择是通过引用接受一个std::vector,只需调用push_就可以了。我希望避免强迫我的类的消费者使用std::vector。因此,我创建了一个成员模板,该模板使用目标迭代器。看起来是这样的: template <typename TForwardIterator, typename TOutputIterator> TOutputIterator UrlExtractor::get_urls( TForwardIterator begin, TForwardIterator end, TOutputIterator dest); 模板 ToutPutiator UrlExtractor::获取URL( t前进迭代器开始, t前进迭代器结束, Toutputiator dest);,c++,iterator,return-value,C++,Iterator,Return Value,我觉得我把事情复杂化了。我喜欢在C++中编写相当通用的代码,而且我很难锁定我的接口。但后来我陷入了困境,我试图将一切模板化。此时,阅读代码的人没有意识到,t正向迭代器正在对std::string进行迭代 在我的特殊情况下,我想知道这是否是一件好事。在什么时候开始使代码更加明确?是否有一种标准的方法可以从函数中获得一般性的值?是的,您太笼统了。模板的要点是,您可以生成多个行为不同的函数副本。您可能不希望这样,因为您应该选择一种表示URL的方式,并在整个程序中使用它 那你怎么办呢 typedef s

我觉得我把事情复杂化了。我喜欢在C++中编写相当通用的代码,而且我很难锁定我的接口。但后来我陷入了困境,我试图将一切模板化。此时,阅读代码的人没有意识到,
t正向迭代器
正在对
std::string
进行迭代


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

是的,您太笼统了。模板的要点是,您可以生成多个行为不同的函数副本。您可能不希望这样,因为您应该选择一种表示URL的方式,并在整个程序中使用它

那你怎么办呢

typedef std::string url;
这允许您将来更改用于URL的类


也许
std::vector
实现了一些带有
push_back()
的接口,您的方法可以引用该接口(
back_inserter
?)。

是的,您太笼统了。模板的要点是,您可以生成多个行为不同的函数副本。您可能不希望这样,因为您应该选择一种表示URL的方式,并在整个程序中使用它

那你怎么办呢

typedef std::string url;
这允许您将来更改用于URL的类


也许
std::vector
实现了一些带有
push_back()
的接口,您的方法可以引用该接口(
back_inserter
?)。

是的,它不仅很好,而且是一个非常好的设计。模板化是大多数标准库算法的工作方式,如
std::fill
std::copy
;它们与迭代器一起工作,这样您就可以填充一个已经包含元素的容器,或者您可以使用
std::back\u inserter
将一个空容器中的数据填充进去

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

您可以这样使用它(但您已经知道):

std::list l;
std::向量v;
x、 获取URL(开始(dat1),结束(dat1),std::back_插入器(l));
y、 获取URL(开始(dat2),结束(dat2),std::back_插入器(v));

<>我感觉到你害怕使用模板,他们不是“正常”的C++,或者他们应该避免和臃肿或什么。我向你保证,它们是非常正常的,是其他语言(我所知)所没有的强大的语言特性,所以只要合适使用它们,就使用它们。在这里,它非常合适。

是的,它不仅很好,而且是一个非常好的设计。模板化是大多数标准库算法的工作方式,如
std::fill
std::copy
;它们与迭代器一起工作,这样您就可以填充一个已经包含元素的容器,或者您可以使用
std::back\u inserter
将一个空容器中的数据填充进去

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

您可以这样使用它(但您已经知道):

std::list l;
std::向量v;
x、 获取URL(开始(dat1),结束(dat1),std::back_插入器(l));
y、 获取URL(开始(dat2),结束(dat2),std::back_插入器(v));

<>我感觉到你害怕使用模板,他们不是“正常”的C++,或者他们应该避免和臃肿或什么。我向你保证,它们是非常正常的,是其他语言(我所知)所没有的强大的语言特性,所以只要合适使用它们,就使用它们。在这里,这是非常合适的。

如果不知道实际的用例场景,很难说,但是 一般来说,最好避免使用模板(或任何其他不必要的模板) 复杂性)除非它真的给你买了东西。最明显的 签名如下:

std::vector<Url> UrlExtractor::get_urls( std::string const& source );
std::vector UrlExtractor::get_URL(std::string const&source);
是否真的有可能需要解析任何内容 但是一个
std::string
?(如果您也支持输入,则可能会有 迭代器。但是在实践中,如果您正在解析,那么源代码将是 要么是
std::string
要么是
std::istream&
。除非您真的想这样做 支持后者,只需使用
std::string
)当然还有客户端代码 可以对返回的向量执行任何操作,包括追加 将其复制到另一种类型的集合

如果返回
std::vector的成本确实成为一个问题,那么
可以将
std::vector&
作为参数。我什么也看不见 合理的情况下,任何额外的灵活性都会给您带来很多好处, 像
get_url
这样的函数可能相当复杂,而且
这不是你想放在标题中的那种东西。

如果不知道实际的用例场景,很难说,但是 一般来说,最好避免使用模板(或任何其他不必要的模板) 复杂性)除非它真的给你买了东西。最明显的 签名如下:

std::vector<Url> UrlExtractor::get_urls( std::string const& source );
std::vector UrlExtractor::g
class UrlExtractor
{
    ...... STUFF
    iterator begin(); 
    iterator end();
};