Как создать функцию для использования в std :: ostream или std :: cout - PullRequest
0 голосов
/ 14 апреля 2020

Есть ли способ создать функцию, которую можно использовать между двумя << операторами в 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;

Какой напечатал бы:

У вас есть: 5 долларов США


Я бы предпочел решение без необходимости в классе. Если вы должны использовать класс, я бы предпочел вообще не упоминать этот класс при использовании функции usd. (Например, как работает функция std::setw)


EDIT :
В моей реализации я намереваюсь использовать функцию std::hex, описанная выше была просто упрощенный пример, но, вероятно, не должно быть.

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

Поэтому я не уверен, достаточно ли функции, возвращающей простую строку.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2020

Чтобы получить использование, которое вы описали:

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

Вам просто нужно usd(a), чтобы вернуть что-то, для чего у вас есть оператор ostream<<, например std::string, а не пользовательский * Требуется оператор 1007 *.

Например:

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

Вы можете написать другие функции для печати в других валютах или для конвертации между ними, например, c, но если все, что вы хотите для обработки USD, этого было бы достаточно.


Если бы вы использовали класс, представляющий деньги, вы могли бы написать 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: $5 USD"
    return 0;
}
1 голос
/ 14 апреля 2020

Я не знаю, как это сделать без класса. Тем не менее, это легко сделать с классом.

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