简体   繁体   中英

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

Is there a way to create a function which you can use between two << operators in an ostream?

Let's assume the function's name is usd , and might look something like:

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

Then I would like to use it like:

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

Which would print:

You have: $5 USD


I would prefer a solution without the need for a class. If you must use a class I would prefer not to mention the class at all when using the usd function. (For example how the std::setw function works)


EDIT :
In my implementation I intend to use the std::hex function, the one described above was just a simplified example but probably shouldn't have.

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

So I am not sure if a function returning a simple string is sufficient.

To obtain the usage you described:

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

You'd simply need usd(a) to return something that you have an ostream<< operator for, like a std::string , and no custom ostream<< operator is needed.

For example:

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

You can write other functions to print in other currencies, or to convert between them, etc but if all you want to handle is USD, this would be sufficient.


If you used a class representing money, you could write an ostream<< for that class and you wouldn't need to call a function at all (given that your default ostream<< prints 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: $5 USD"
    return 0;
}

I don't know how to do this without a class. However, it is easy to do with a 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;
}

for hex

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;
}

usage

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM