如何创建要在 std::ostream 或 std::cout 中使用的函数

How to create a function to be used in an std::ostream or std::cout

有没有办法创建一个可以在 ostream 中的两个 << 运算符之间使用的函数?

让我们假设函数的名称是 usd,并且可能类似于:

std::ostream& usd(std::ostream& os, int value) {
    os << "$" << value << " USD";
    return os;
}

那么我想像这样使用它:

int a = 5;
std::cout << "You have: " << usd(a) << std::endl;

这将打印:

You have: USD


我更喜欢不需要 class 的解决方案。 如果您必须使用 class,我宁愿在使用 usd 函数时完全不提及 class。 (例如 std::setw 函数的工作原理)


编辑:
在我的实现中,我打算使用 std::hex 函数,上面描述的只是一个简化的示例,但可能不应该使用。

std::ostream& hex(std::ostream& os, int value) {
    os << "Hex: " << std::hex << value;
    return os;
}

所以我不确定返回简单字符串的函数是否足够。

获取您描述的用法:

int a = 5;
std::cout << "You have: " << usd(a) << std::endl;

你只需要 usd(a) 到 return 一些你有 ostream<< 运算符的东西,比如 std::string,没有自定义 ostream<<需要运算符。

例如:

std::string usd(int amount)
{
    return "$" + std::to_string(amount) + " USD";
}

您可以编写其他函数来打印其他货币,或在它们之间进行转换等,但如果您只想处理美元,这就足够了。


如果您使用 class 表示金钱,您可以为 class 编写一个 ostream<<,并且您根本不需要调用函数(假定您的默认ostream<< 打印 USD)

class Money
{
    int amount;
};

std::ostream& usd(std::ostream& os, Money value) {
    os << "$" << value.amount << " USD";
    return os;
}

int main(int argc, char** argv)
{
    Money a{5};
    std::cout << "You have: " << a << std::endl; // Prints "You have:  USD"
    return 0;
}

如果没有 class,我不知道该怎么做。但是,使用 class.

很容易做到
struct usd {
    int value;
    constexpr usd(int val) noexcept : value(val) {}
};

std::ostream& operator<<(std::ostream& os, usd value) {
    os << "$" << value.value << " USD";
    return os;
}

十六进制

struct hex {
    int value;
    constexpr hex(int val) noexcept : value(val) {}
};

std::ostream& operator<<(std::ostream& os, hex value) {
    os << "Hex: " << std::hex << value.value;
    return os;
}

用法

int a = 5;
std::cout << "You have: " << usd(a) << std::endl;
std::cout << "You have: " << hex(a) << std::endl;