gpt4 book ai didi

c++ - 将某些内容打印到 std::ostream 并返回 std::ostream 的函数?

转载 作者:可可西里 更新时间:2023-11-01 17:08:39 59 4
gpt4 key购买 nike

我想写一个函数输出一些东西到 ostream传入并返回流,如下所示:

std::ostream& MyPrint(int val, std::ostream* out) {
*out << val;
return *out;
}

int main(int argc, char** argv){
std::cout << "Value: " << MyPrint(12, &std::cout) << std::endl;
return 0;
}

像这样打印值并将函数调用嵌入输出运算符链会很方便,就像我在 main() 中所做的那样.

然而,它不起作用,并打印出:

$ ./a.out
12Value: 0x6013a8

期望的输出是这样的:

Value: 12

我该如何解决这个问题?我必须定义一个 operator<< 吗?相反?

更新:阐明了所需的输出。

UPDATE2:有些人不明白为什么我要打印这样的数字,使用函数而不是直接打印它。这是一个简化的示例,实际上该函数打印的是一个复杂的对象而不是 int。 .

最佳答案

您无法修复该功能。规范中没有任何内容要求编译器针对同一表达式中的某些不相关运算符以任何特定顺序评估表达式中的函数调用。因此,如果不更改调用代码,您将无法制作 MyPrint()std::cout << "Value: " 之后评估

由多个连续 << 运算符组成的表达式必须采用从左到右的顺序,这样才行得通。 operator<< 返回流的要点是,当操作符被链接时,每个操作符的 LHS 由其左侧的操作符的评估提供。

您无法通过自由函数调用实现相同的目的,因为它们没有 LHS。 MyPrint()返回等于 std::cout 的对象,std::cout << "Value: "也是如此,所以你实际上在做 std::cout << std::cout ,它正在打印该十六进制值。

因为期望的输出是:

Value: 12

“正确”的做法确实是覆盖运算符<<。这通常意味着您需要与它交 friend ,或者这样做:

class WhateverItIsYouReallyWantToPrint {
public:
void print(ostream &out) const {
// do whatever
}
};

ostream &operator<<(ostream &out, const WhateverItIsYouReallyWantToPrint &obj) {
obj.print(out);
}

如果覆盖 operator<<对于你的类(class)是不合适的,例如因为你可能想要打印多种格式,并且你想为每种格式编写一个不同的函数,那么你应该放弃运算符链接的想法而只调用函数,或者编写多个将您的对象作为构造函数参数的类,每个类都有不同的运算符重载。

关于c++ - 将某些内容打印到 std::ostream 并返回 std::ostream 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1087927/

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