literal operator字面量运算符重载
// 这种形式是通过重载operator ""(双引号)后缀运算符实现的(称为literal operator,字面量运算符)
/*
C++11新特性之用户字面量操作符
https://blog.csdn.net/jxianxu/article/details/80641810
在C++11标准中,对字面量操作符的使用定了一些规则:
1. 如果字面量为整形数,那么操作符函数只可接受unsigned long long 或者 const char *作为参数,当unsigned long long 无法容纳该字面量的时候,编译器会自动将该字面量转化为以'\0'结尾的字符串,并调用以const char*为参数的版本进行处理。
2. 如果字面量为浮点数,操作符函数只可接受long double 或者 const char* 为参数,const char*版本调用方式与整形一样,在当long double 无法容纳时调用。
3. 如果字面量为字符串,操作符函数只可接受const char*,size_t为参数。
4. 如果字面量为字符,则操作符函数只接受一个char为参数。
此外,应该注意 operater "" 与用户自定义的后缀之间必须有空格。后缀建议以下划线开始。
*/
如果字面量为整形数
//========================================================================
#include <iostream>
int operator ""_heima(unsigned long long temp) { // 自定义的_heima运算符
std::cout << "执行了operator函数:" << temp << std::endl;
return temp;
}
int main() {
int output1 = 147258369_heima;
int output2 = 2147483647_heima;
int output3 = 2147483648_heima; // 注意int的范围
std::cout << "输出:" << output1 << std::endl;
std::cout << "输出:" << output2 << std::endl;
std::cout << "输出:" << output3 << std::endl;
}
//========================================================================
如果字面量为浮点数
//========================================================================
#include <iostream>
int operator ""_heima(long double temp) { // 自定义的_heima运算符
std::cout << "执行了operator函数:" << temp << std::endl;
return temp;
}
int main() {
int output1 = 147258369.0_heima;
int output2 = 2147483647.0_heima;
int output3 = 2147483648.0_heima; // 注意int的范围
std::cout << "输出:" << output1 << std::endl;
std::cout << "输出:" << output2 << std::endl;
std::cout << "输出:" << output3 << std::endl;
}
//========================================================================
如果字面量为字符串
//========================================================================
#include <iostream>
std::string operator ""_heima(const char *sz, size_t n) { // 自定义的_heima运算符
std::cout << "执行了operator函数:" << sz << " " << n << std::endl;
return std::string{sz, n};
}
int main() {
// std::string str1 = 'test literal'_heima;
std::string str2 = "test literal"_heima;
// std::cout << "输出:" << str1 << std::endl;
std::cout << "输出:" << str2 << std::endl;
}
//========================================================================
如果字面量为字符
//========================================================================
#include <iostream>
char operator ""_heima(char temp) { // 自定义的_heima运算符
std::cout << "执行了operator函数:" << temp << std::endl;
return temp;
}
int main() {
char c1 = 't'_heima;
// char c2 = 'tt'_heima;
std::cout << "输出:" << c1 << std::endl;
// std::cout << "输出:" << c2 << std::endl;
}
//========================================================================
operator""_heima()=
cmake_minimum_required(VERSION 3.14)
project(test)
set(CMAKE_CXX_STANDARD 11)
add_executable(test test.cpp)
//========================================================================
#include <iostream>
#include <chrono>
//#include <thread> // 里面会导入#include <chrono>
//constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。
std::chrono::minutes operator""_heima(unsigned long long m) { // 字面量运算符重载规定了参数类型只有几种
std::cout << "执行了operator函数:" << m << std::endl; // constexpr存在,没法运行这行代码
return std::chrono::minutes(m);
}
int main() {
const std::chrono::minutes &duration = 24_heima; // 24会传递给参数m
std::cout << "输出:" << duration.count() << std::endl;
}
//========================================================================
直接使用min(123)或123min
cmake_minimum_required(VERSION 3.14)
project(test)
set(CMAKE_CXX_STANDARD 14) # 不能用11
add_executable(test test.cpp)
//========================================================================
#include <iostream>
#include <chrono>
//#include <thread> // 里面会导入#include <chrono>
using namespace std::chrono; // C++11和C++14都可以用
//using namespace std::chrono_literals; // C++14才能用
//using namespace std::literals; // C++14才能用
//using namespace std::literals::chrono_literals; // C++14才能用
// TODO min要在C++14才能用
int main() {
//--------------------------------------------------------------
const std::chrono::duration<long double, std::ratio<60, 1>> &duration = std::chrono::operator ""min(123);
const std::chrono::duration<long double, std::ratio<60, 1>> &duration1 = std::chrono_literals::operator ""min(123);
const std::chrono::duration<long double, std::ratio<60, 1>> &duration2 = std::literals::operator ""min(123);
const std::chrono::duration<long double, std::ratio<60, 1>> &duration3 = std::literals::chrono_literals::operator ""min(123);
std::cout << "消耗的时间1:" << duration.count() << std::endl;
std::cout << "消耗的时间2:" << duration1.count() << std::endl;
std::cout << "消耗的时间3:" << duration2.count() << std::endl;
std::cout << "消耗的时间4:" << duration3.count() << std::endl;
//--------------------------------------------------------------
// 系统自带的min运算符
123min; // C++14才能用
const std::chrono::minutes &temp = 456min;
std::cout << "消耗的时间5:" << temp.count() << std::endl;
//--------------------------------------------------------------
}
//========================================================================