如何创建要在 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;
有没有办法创建一个可以在 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;