gpt4 book ai didi

c++ - 使在流上模板化的类同时处理 std::cout 和 std::ofstream

转载 作者:行者123 更新时间:2023-11-28 02:07:22 25 4
gpt4 key购买 nike

我想编写一个在 Stream 上模板化的类 StreamContainer:

#ifndef STREAMCONTAINER_HPP
#define STREAMCONTAINER_HPP
#include <string>
#include <iostream>
template<typename Stream>
class StreamContainer
{
public:
StreamContainer(std::ostream& os)
: m_stream(os) {}
private:
Stream & m_stream;
};

#endif

我认为以下客户端代码可以工作:

#include "StreamContainer.hpp"
#include <fstream>
int main(int argc, char argv[])
{
std::ofstream ofs;
ofs.open("c:\\code\\temp.txt");
StreamContainer<decltype(std::cout)> coutContainer(std::cout); // C2439
StreamContainer<std::ofstream> fileContainer(ofs); // C2664
}

但这不起作用,至少在 Visual C++ 2015 中是这样。尝试传递 std::cout 会导致错误 C2439(无法初始化成员)并尝试传递 std::ofstream 对象会导致错误 C2664(std: :basic_ofstream 构造函数无法将参数从 std::basic_ostream 转换为 const char *)。我也尝试过使用移动构造函数,但还有其他问题。对于如何解决此问题的任何建议,我们将不胜感激。

最佳答案

这个:

StreamContainer(std::ostream& os)

应该是:

StreamContainer(Stream& os)

否则,您的 ofstream 实例化试图将 ofstream& 引用 (m_stream) 引用到 ostream ( 操作系统)。另一个方向很好,但这是将基类对象分配给派生引用。


因为你不能从构造函数参数中推导出类模板参数,所以这是一个只引入工厂函数的好用例:

template <typename Stream>
StreamContainer<Stream> make_container(Stream& s) {
return StreamContainer<Stream>{s};
}

这样你就不必重复参数,或者更糟的是,使用 decltype:

auto coutContainer = make_container(std::cout);
auto fileContainer = make_container(ofs);

或者,实际上,如果您不需要任何特定类型,则两者都可以是 ostream&

关于c++ - 使在流上模板化的类同时处理 std::cout 和 std::ofstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968155/

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