神奇的字面量运算符
题目描述
C++11 中新增了一种运算符重载,称为用户定义字面量运算符。这个运算符允许你给一些字面量(比如整数字面量 42
或者字符串字面量 "abc"
等等)添加自定义的后缀。比如我可以定义整数后缀 _mult
的含义就是给这个整数乘上 2.5:
double years = 1_mult;
std::cout << 1_mult << std::endl; // 输出 2.5
那么具体怎么做呢?只需要在全局添加一个名字叫 operator""_mult
的函数。如果这个函数的形参类型是 unsigned long long
,那这就是一个整数字面量的自定义后缀:
double operator""_mult(unsigned long long x) {
return x * 2.5;
}
类似地,如果形参类型是 long double
,那么它可以添加到浮点数字面量后面。如果形参类型是 const char*
之类的,那它可以添加到字符串字面量后面。你可以给同一个后缀添加多个重载。
本题的要求是实现一个“虚数单位”的字面量后缀运算符 _i
。我们给出了一个最简单的复数类Complex
,你需要让 _i
这个后缀得到一个复数对象。
关于输入
无
关于输出
见样例输出
参考答案
#include <iostream>
struct Complex {
double real;
double imag;
};
std::ostream& operator<<(std::ostream& os, const Complex& c) {
return os << c.real << '+' << c.imag << 'i';
}
Complex operator""_i(unsigned long long s) {
return Complex{0, double(s)};
}
Complex operator""_i(long double s) {
return Complex{0, double(s)};
}
int main() {
std::cout << 5_i << std::endl;
std::cout << 3.14_i << std::endl;
}