如何在 C++ 函数中将其他变量作为参数与 std::ostream 一起传递?

How to pass other variables as args along with std::ostream in a function in C++?

我正在开发一个看起来像这样的函数:

inline std::ostream& mvUp(int n,std::ostream& ss){
    char u[8];
    sprintf(u,"3[%dA",n);
    ss<<u;
    return ss;
}

并像这样使用它:

std::cout<<mvUp(1);

然而它显示错误:

std::cout<<mvUp(1);
     |          ^_____too few args in function call
     ^_______________no operator "<<" match these operands

我也试过:std::cout<<mvUp(1,std::cout);但还是不行。

std::cout<<mvUp(1);
     ^_______________no operator "<<" match these operands

现在当我尝试制作模板时,

template <int n>
inline std::ostream& mvUp(std::ostream& ss){
    char u[8];
    sprintf(u,"3[%dA",n);
    ss<<u;
    return ss;
}

并使用它:std::cout<<mvUp<1>,这完全可以正常工作,但问题是模板采用 const args。

无法弄清楚我哪里错了。另外,当我不传递任何参数时,它在模板中如何工作?

std::ostream& mvUp(std::ostream& ss); std::cout << mvUp<1> 起作用的事实 不是 C++ 函数调用语法的特性。

std::cout 已重载其 operator<< 以接受像这样的单参数函数,并通过将其自身作为第一个参数传递来调用它们。

鉴于 std::ostream& mvUp(int n,std::ostream& ss);std::cout<<mvUp(1) 不起作用,因为您的函数没有一个参数。并且 std::cout << mvUp(1,std::cout); 不起作用,因为您的函数 returns std::ostream& 无法打印。

通用解决方案是制作一个 class 并重载 operator<<。但是,正如另一个答案所暗示的那样,在这里您可以创建一个 returns std::string 的函数,并打印其 return 值。

现代 C++ 代码使用 std::string,以及其他 类。这使得实现这种重载变得微不足道。

#include <string>
#include <sstream>

inline std::string mvUp(int n) {
    std::ostringstream o;

    o << "3[" << n << "A";
    return o.str();
}

然后,一切都会自动运行:

std::cout<<mvUp(1);

您的 mvUp returns std::string,现有的 << 重载负责其余部分。

您正在尝试创建自定义 ostream 操纵器,类似于 std::setw()<iomanip> 库中的其他操纵器。但是你所写的并不是实现它的正确方法。您的操纵器需要 return 一种类型来保存您要用来操纵流的信息,然后您需要重载 operator<< 以流出该类型。这将使您能够访问 ostream,然后您可以根据需要对其进行操作。

试试像这样的东西:

struct mvUpS
{
    int n;
};

mvUpS mvUp(int n) {
    return mvUpS{n};
}

std::ostream& operator<<(std::ostream& ss, const mvUpS &s) {
    return ss << "3[" << s.n << "A";
}

现在 std::cout << mvUp(1); 将按预期工作。

Demo