C++的字面量运算符重载literal operator

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;

//--------------------------------------------------------------

}
//========================================================================

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值