神奇的字面量运算符

题目描述

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