繁体   English   中英

模板成员函数写入输出迭代器

[英]Template Member Function to Write to Output Iterator

我以为我会聪明并创建接受输出迭代器的成员函数。 这样,我可以避免返回集合或通过引用获取集合。 例如:

template <typename TOutIterator>
void getHeaderNames(TOutIterator destination);

template <typename TOutIterator>
void getHeaderValues(std::string const& name, TOutIterator destination);

这些函数会将结果写入传入的迭代器中。这样,我不必担心我是在写一个集合,向量还是ostream。

现在我感觉不那么聪明。 我想将这些函数设置为虚拟,以便我可以在测试中删除实现。 不幸的是,模板成员函数不能是虚拟的,这是有道理的。

有没有办法保持这些函数通用(写入任何东西)并允许它们同时是虚拟的? 我想避免将所有内容写入向量,只是转向并将其写入标准输出或其他任何内容。

如果我需要更清楚地解释我的情况,请告诉我。

您可以使用类型擦除来操作多态迭代器,例如Thomas Becker提出any_iterator (后来在Boost.Range中实现 )。 你最终会得到一些东西:

typedef any_iterator<
  std::string, // Value
  Writable,    // Access
  Forward,     // Traversal
> StringOutputIterator; // can represent any output iterator accepting strings

virtual void getHeaders(StringOutputIterator destination);

类型擦除的想法是为一组其他不相关的类型(由于使用模板而在C ++中经常发生)具有公共基类。 例如, std::function通过允许以类似方式操作函数指针,仿函数或lambda来将此成语应用于可调用对象。

我遇到了类似的问题,我不想将Boost添加到我的项目中......所以我决定不使用迭代器。

我最终使用std::function代替:

void getHeaderNames(std::function<void(std::string)> destination);

void getHeaderValues(std::string const& name, std::function<void(std::string)> destination);

然后,我提供了一个执行push_back的lambda,而不是std::back_inserter

std::vector<std::string> v;
getHeaderNames([&](auto name) { v.push_back(std::move(name)); });

保持它们通用的一种方法,我通常在实践中看到这是两个重载流输出操作符(如果它有意义)或采取std::ostream&

当然这取决于你的确切情况:你在编写迭代器更有意义的算法吗? 或者只想转储对象的内容?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM