gpt4 book ai didi

c++ - 写入输出迭代器的模板成员函数

转载 作者:太空狗 更新时间:2023-10-29 21:48:18 24 4
gpt4 key购买 nike

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

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

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

这些函数会将它们的结果写入传入的任何迭代器。这样,我就不必担心是写入集合、 vector 还是 ostream。

现在感觉自己没那么聪明了。我想让这些函数成为虚拟函数,这样我就可以在测试中 stub 实现。不幸的是,模板成员函数不能是虚拟的,这是有道理的。

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

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

最佳答案

你可以使用 type erasure操作多态迭代器,比如 any_iterator proposed by Thomas Becker (以及后来的 implemented in 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);

类型删除的想法是为一组不相关的类型设置一个公共(public)基类(由于模板的使用,这种情况在 C++ 中经常发生)。例如,std::function 通过允许以类似方式操作函数指针、仿函数或 lambda,将此习语应用于可调用对象。

关于c++ - 写入输出迭代器的模板成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036076/

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