Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将某些内容打印到std::ostream并返回std::ostream的函数?_C++_Outputstream_Ostream - Fatal编程技术网

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

C++ 将某些内容打印到std::ostream并返回std::ostream的函数?,c++,outputstream,ostream,C++,Outputstream,Ostream,我想编写一个函数,将某些内容输出到传入的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

我想编写一个函数,将某些内容输出到传入的
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;
}
所需的输出如下:

Value: 12

我怎样才能解决这个问题?我是否必须定义一个
运算符如果要使MyPrint成为一个具有友元运算符的类,首先,没有理由不通过引用而不是指针传入
ostream

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

在你的情况下,答案显然是:

 std::cout << "Value: " << 12 << std::endl;

std::cout您无法修复该函数。规范中的任何内容都不要求编译器以任何特定顺序对表达式中的函数调用与同一表达式中的某个无关运算符进行求值。因此,如果不更改调用代码,您无法使
MyPrint()
evaluate after
std::cout由于函数的求值顺序,无法实现您期望的结果


是否有任何特殊原因需要像这样直接写入ostream?如果没有,请让MyPrint返回一个字符串。如果要使用MyPrint中的流生成输出,只需使用strstream并返回结果。

您有两个选项。第一,使用您已有的内容:

std::cout << "Value: ";
MyPrint(12, &std::cout);
std::cout << std::endl;

更改指向引用的指针后,可以执行以下操作:

class MyPrint
{
public:
    MyPrint(int val, std::ostream& os) : val_(val), os_(os) {}
    friend std::ostream& operator<<(std::ostream& dummy, const MyPrint& mp) 
    {
        mp.os_ << mp.val_;
        return os_;
    }
private:
    int val_;
    std::ostream& os_
};

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

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

int main(int, char**) {
    MyPrint(11, std::cout << "Value: ") << std::endl; 

    return 0;
}
#包括
标准::ostream和MyPrint(int-val,标准::ostream和out){


你为什么要通过指针而不是引用来传递流呢?也许他读过谷歌风格的指南,并相信“不要使用非常量引用参数”时尚正在流行。还有,不做
cout@Neil和@onebyone有什么意义:是的,我开始使用谷歌风格的约定。Re:UPDATE2——要打印你的这个复杂对象,为什么不定义一个新的重载std::operatorExcept,它不符合要求。好吧,首先,它不编译。糟糕复制/粘贴。感谢捕获。它不必是朋友;它只使用std::ostream的公共方法。@Max Lybbert.1)你所说的“方法”是什么意思?2)函数
运算符“没有理由不通过引用传入ostream”。有些人不喜欢非常量引用参数。我不同意他们的观点,但我不会说他们的偏好“没有理由”。我不认为在任何健全的编码标准中,非常量指针比非常量引用更可取。谷歌说“引用可能会令人困惑,因为它们有值语法,但有指针语义”()我认为它们意味着在调用站点中,按值传递和引用传递看起来是相同的,因此,如果读者可以假定任何看起来像是通过值的值,则代码更可读。这样一来,谷歌就如同狐狸一样疯狂。它对C++有一些稍微过时的态度,但我是THI。nk不合理。标准
运算符"标准运算符我知道,当我不能理解一些事情时,我总是发现将流分解为传统函数调用更容易,所以我想我应该在OP中添加这个,以防它对他们也有帮助。希望你不介意。我想我说的std::cout行基本上可以归结为cout。运算符更新了这个问题;它现在表示所需的输出将是Value:12。@SteveJessop您可能忘记了在
运算符的末尾添加
return
语句。该示例明显简化,并显示用户希望了解如何链接流操作。与这里的许多人不同,我没有理解“明显的”未被问到的问题-我喜欢把事情说清楚。我认为你应该把你的图标改成一个脾气暴躁的海星:-(如果你能给我找到一个,我很乐意使用它。
Value: 12
class WhateverItIsYouReallyWantToPrint {
    public:
    void print(ostream &out) const {
        // do whatever
    }
};

ostream &operator<<(ostream &out, const WhateverItIsYouReallyWantToPrint &obj) {
    obj.print(out);
}
std::cout << "Value: ";
MyPrint(12, &std::cout);
std::cout << std::endl;
#include <iostream>

struct X {
    int y;
};

// I'm not bothering passing X as a reference, because it's a
// small object
std::ostream& operator<<(std::ostream& os, const X x)
{
    return os << x.y;
}

int main()
{
    X x;
    x.y = 5;
    std::cout << x << std::endl;
}
#include <iostream>

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

int main(int, char**) {
    MyPrint(11, std::cout << "Value: ") << std::endl; 

    return 0;
}