链式"运算符"的优势在于Variadic模板函数?

And*_*zos 2 c++ c++11

考虑以下C++代码:

A a = ...;
B b = ...;
C c = ...;

cin >> a >> b >> c;
...
cout << a << b << c;
Run Code Online (Sandbox Code Playgroud)

既然我们有C++ 11可变参数模板函数(我认为)它可以通过以下方式之一实现:

cin.read(a,b,c);
cout.write(a,b,c);

read(cin,a,b,c);
write(cout,a,b,c);

cin(a,b,c);
cout(a,b,c);
Run Code Online (Sandbox Code Playgroud)

链式<<运算符在这些方面有什么优势吗?换句话说-你想,如果他们有他们仍然会用在一开始可变参数模板的功能operator <<operator >>?如果是这样,为什么?

Nic*_*las 5

iostream最重要的一个方面是它是可扩展的.您可以添加新类型,您需要做的就是<<为写入和>>阅读提供重载.

您需要为可变参数版本提供类似的机制.

您必须提供一些全局或命名空间范围的函数名称,这些函数名称将由依赖于参数的查找istream::read和调用ostream::write.该函数的名称需要明确定义.但你根本找不到该功能的名称cin.read(a,b,c);.除非是这样read,在这种情况下,你会遇到许多潜在的名称冲突问题.

这种机制比重载更不明显operator<<.您需要查找文档以了解写入重载的函数的名称是什么,而operator<<在语句中就是这样:cout << ....

  • 难道你不能只重载单参数版本?可变版本使用它? (2认同)
  • 是的但是对于某些`f`,你可以重载`f(cin,x)`然后有`f(cin,a,b,c)`call`f(cin,a)`,`f(cin,b) )`和`f(cin,c)`.`f`可以是`read` /`write`,`scan` /`print`,`get` /`put`等等. (2认同)
  • @NicolBolas:你在问这个问题.如果`read(istream&,...)`已经从iostream的开头就到了,那么就不太可能有人会将`read(istream&,...)`用于其他东西,因为它们会使用它们`operator >>(istream&,...)`用于今天的其他东西. (2认同)