0

在“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); 
4

1 回答 1

0

您混淆了此功能中可用的两个“灵活性”。

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

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


笔记

  1. 请注意,在更多“类似 STL 2 ”的接口中,您通常不会收到这样的向量,但更可能是几个迭代器。实际上,标准库更喜欢用一种更抽象的方式来解决这个问题 ( std::ostream_iterator,它允许你使用std::copy将数据从容器迭代器复制到输出流);
  2. 吹毛求疵的人:我知道,你不会说服我的。
于 2013-10-12T13:57:19.673 回答