通过 wofstream 打印到文件

Print to file via wofstream

下面的代码不起作用并给出编译错误:

Severity Code Description Project File Line Suppression State Error invalid operands to binary expression ('std::wofstream' (aka 'basic_ofstream >'))

代码是:

template <class T>
void printtofile(std::string filename, int mode, T var, std::wstring msg)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << msg << L"\n";
    outfile << var << L"\n";
    outfile.close();
}

如果我注释掉下面这行就没有错误了。

    outfile << var << L"\n";

好的。奇怪和令人困惑的是,如果我如下添加具有不同参数的函数,则没有错误,尽管我没有注释掉上面提到的行:

template <class T>
void printtofile(std::string filename, int mode, T var)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << var << L"\n";
    outfile.close();
}

这不是一回事吗?这是怎么回事?

如果 outfile << var << L"\n"; 编译失败,那是因为 var 的类型没有像这样的重载:

std::wofstream& operator<<(std::wofstream&, const T&);

例如,如果您尝试将 std::string 传递给函数,那将导致相同的错误。

为了使函数的用户更清楚错误,您可以使用 SFINAE 仅实例化支持类型的模板:

template<class T>
auto printtofile(const std::string& filename, int mode, T var,
                 const std::wstring& msg)
    -> decltype(std::wofstream{} << var, void()) {
//...
}

如果您现在尝试将它与不受支持的类型一起使用,错误将变成如下内容:

error: no matching function for call to
 ‘printtofile(..., int, <the offending type>, std::wstring&)’

您需要为 var 类型和 std::string 类型重载 << 运算符,您可以将其简化为 C 样式字符串并绕过错误。

示例:

outfile<<msg.c_str()<<L"\n";