模板函数中的ostream默认参数

时间:2013-10-12 13:42:06

标签: c++ templates io

在“Essential C ++”一书中(更具体地说,第2.7部分),作者通过以下示例简要讨论了模板函数的用法,该示例显示了一条诊断消息,然后遍历了一个向量的元素

template <typename T> 
void display_message(const string& msg, const vector<T>& vec)
{
    cout << msg; 

    for (int i = 0; i < vec.size(); ++i)
        cout << vec[i] << ' '; 
}

所以,这个例子让我感兴趣,因为我(可能像许多其他爱好者开发者)一直认为在大多数应用程序中,标准输入/输出流被用于通信和数据处理。然后作者提到这种实现display_message的方式更灵活。你能举个例子说明这种灵活性“闪耀”吗?可以这么说吗?换句话说,是否存在可选的第三个参数采用另一个输入/输出表示(例如,嵌入式设备)的情况,或者它只是一个简单的添加,应该与简单的结构一起使用,而不是极端的我试图描述的情况?

编辑:正如 @Matteo Italia 注意到的,这是函数声明

void display_message(const string&, const vector<T>&, ostream& = cout); 

1 个答案:

答案 0 :(得分:0)

你混淆了两个&#34;灵活性&#34;可以在此功能中使用。

  • 模板部分(我认为是作者正在谈论的部分)允许您传递任何std::vector<T>,因为T可以输出溪流;即你可以传递整数,双精度甚至自定义对象的向量,函数将很乐意在给定的流上输出它; 1

  • stream 部分(引起你的注意)是允许你为输出部分指定任何(窄)输出流;它很有用,因为您可能希望在其他一些流上输出您的消息(以及您的向量);例如,如果它是一条错误消息,您将需要cerr;最重要的是,如果您要写入文件,您将传递文件流。


备注

  1. 注意到更多&#34; STL 2 -like&#34;接口通常你不会收到这样的矢量,但更可能是几个迭代器。实际上,标准库更喜欢一种更抽象的方法来解决这个问题(std::ostream_iterator,它允许你使用std::copy将数据从容器迭代器复制到输出流);
  2. to nitpickers:我知道,你不会说服我。