【发布时间】:2015-11-02 12:15:46
【问题描述】:
为什么带有用户定义类C 的流操作的典型标头通常是这样的:
std::ostream& operator<<(std::ostream& os, const C& c);
std::istream& operator>>(std::istream& is, C&);
不是这样的:
template <class CharT, class Traits>
std::basic_ostream<CharT, Traits>& operator<<(
std::basic_ostream<CharT, Traits>& os
const C& c);
template <class CharT, class Traits>
std::basic_istream<CharT, Traits>& operator>>(
std::basic_istream<CharT, Traits>& is
C& c);
我的问题是为什么流运算符的通常重载是用std::ostream 完成的,这是char 的std::basic_ostream 的typedef,为什么不直接用std::basic_ostream 完成?
例如:
class C
{
...
};
std::ostream& operator<<(std::ostream& os, const C& c)
{
...
}
int main()
{
C c;
std::wofstream myFile("myFile.txt");
myFile << c; //Impossible
}
这里写的operator<< 限制我们只能使用专用于char 的流对象(std::ostream,std::ostringstream,...)。
所以如果使用std::ostream 比std::basic_ostream 更受限制,
为什么在谈论流运算符重载时从未提及std::basic_ostream?
【问题讨论】:
-
很难关注你,请澄清你的问题...你的意思是问为什么使用
std::ostream比std::basic_ostream更常用? -
主要是因为提及它会引入与讨论无关的不相关的并发症。您应该能够根据需要从细节中进行概括。
-
如果你的函数是通用的,那么你必须在一个函数中处理转换为所有不同的字符类型。恕我直言,当您准确指定流类型时,这更容易做到。
-
@NathanOliver 对于内置类型,转换已经完成,如果你想写额外的字符,你可以使用 std::basic_ios::do_widen 。我不认为这真的很烦人,而且这更通用,不是吗?
-
@ThéoVerhelst 走另一条路怎么样?您的班级拥有大量数据,有人想使用
ofstream吗?
标签: c++ templates operator-overloading std stream-operators