gpt4 book ai didi

c++ - 为什么我们不应该在 C++ 中对不带参数的操纵器使用括号?

转载 作者:行者123 更新时间:2023-11-27 22:56:40 25 4
gpt4 key购买 nike

例如 setw 接受一个整数参数,这意味着我们可以编写 setw(5),而操纵符 leftright 什么都不拿。

  1. 为什么使用 left()right() 而不是 leftright?

  2. 带参数和不带参数的操纵器有什么区别?

最佳答案

Why would it be wrong to use left() and right() instead of left and right?

因为它不会编译!

它还会添加额外的函数调用,但完全没有任何好处。如果left本来是作为一个函数被调用的,那么它必须返回一些与 left 具有相同目的的东西。今天做,这将需要定义一个额外的类型和额外的重载 operator<<处理那种类型。何必呢?

What is the difference between manipulators which take arguments and which don't?

那些接受参数的是有状态的,它们返回一些存储参数的对象,然后使用这些参数来改变流状态,例如对于每一个接受争论的操纵者,你都有这样的东西:

struct SetW { int w; };

SetW
setw(int w) { return SetW{w}; }

ostream&
operator<<(ostream& out, SetW sw)
{
out.width(sw.w);
return out;
}

有一个像SetW这样的类型for each manipulator 必须是每种类型的重载。

但对于没有参数的操纵器,它们的定义(大致)如下:

ostream&
left(ostream& out)
{
out.str.setf(ios_base::left, ios_base::adjustfield).
return out;
}

并且有一个重载处理所有这种形式的操纵器,通过接受指向函数的指针作为参数:

using zero_arg_manipulator_type = ostream& (*)(ostream&);

ostream&
operator<<(ostream& out, zero_arg_manipulator_type f)
{
f(out);
return out;
}

这不需要像 SetW 这样的额外类型,并且只有一个重载来处理所有零参数操纵器,因此更简单并且代码更少。

如果您必须调用 left()然后它需要返回一些自定义类型,如 SetW ,因此必须为每个操纵器定义另一种类型,并且必须有更多重载。这会使库复杂化,编译速度变慢,并可能使可执行文件更大更慢。

(为了这个答案,上面的细节被简化了,实际上函数是采用 basic_ostream 而不是 ostream 的模板,并且一些操纵器使用 ios_basebasic_ios 而不是 basic_ostream`,但是这不会改变其工作原理的总体思路)。

关于c++ - 为什么我们不应该在 C++ 中对不带参数的操纵器使用括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com