• User-Defined-Literal自定义字面量


    c++支持多种内置类型的字面量,比如:

    123u // unsigned int
    1.0 // double
    1.6f // float
    'a' // char
    4ULL // unsigned long long
    "as" // c-stype string
    

    而c++11支持为内置类型提供新的自定义字面量的形式,比如:

    “Hi!”s // std::string
    1.2i // imaginary of Complex
    10110000b // binary
    10s // 10 seconds
    100.0km // kilometers
    12345678901234567890123456789x // extentend-precision
    

    这种形式是通过重载operator ""(双引号)后缀运算符实现的(称为literal operator,字面量运算符)。举例说明:

    	string operator""s(const char * sz, size_t n)
    	{
    		return string{sz, n};
    	}
    	
    	constexpr complex<double> operator""i(double d)
    	{
    		return {0.0, d};
    	}
    

    上面代码定义了后缀s和i的重载形式。可以使用下面代码测试:

    	auto cp = 1.6i;
    	auto str = "test literal"s;
    

    这种形式的后缀重载可以使用任意标准未规定的后缀,但是不能重载或重定义已经使用的后缀形式,比如前面提到的d、u、f、l等后缀。operator""支持四种格式的重载:

    • 整型字面量

    重载literal运算符时使用unsigned long longconst char *、或者模板literal运算符,比如:123m,1234567890123456789x。

    • 浮点型字面量

    重载literal运算符时使用long doubleconst char *、或者模板literal运算符,比如:10.0s, 4567.891234567x。

    • 字符串字面量

    重载literal运算符时使用(const char*, size_t)参数,比如:"string"s, "Foobar"_path。

    • 字符

    重载literal运算符时使用char, wchar_t, char16_t, char32_t参数,比如: 'f'_runic, u'BEEF'_w。

    注意c++标准规定保留所有非下划线开头的字面量后缀形式,重载literal运算符时建议使用下划线开头
    如果使用了非下划线开头的literal运算符重载形式,在GCC编译器中也会有警告信息。

    c++11中提供literal运算符的重载形式,给字面常量的处理带来很大的便利性和可定制化处理,比如可以在c++中支持任意进制的数据输入、支持大数处理(不用通过先保存为字符串,然后预处理的机制)等。

    附加说明

    如果有其他描述不清楚的地方,建议参考《c++11标准》或者TCPL ch12.2.5。

    所有代码都在gcc(W64)的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git ,位于c++11目录下的cpp_user_def_literal.cpp文件中。

  • 相关阅读:
    虚拟空间,域名解析,A记录,MX记录,CNAME记录,TTL 等 更多Web服务器相关名词解释
    C# WinForm中的Label换行方法
    SQL 2005 with(nolock)详解
    常用Web Service汇总(天气预报、时刻表等)
    csdn中一篇sock 经验贴..
    如何保护.net中的dll文件(防破解、反编译)
    C#内存流示例>用内存流来读取图片
    QQ网页登陆密码加密方式(农场、空间、WebQQ等通用)
    MySQL数据库对dvbbs.php全文搜索的完全分析
    提搞网站访问速度可做哪些优化
  • 原文地址:https://www.cnblogs.com/tocy/p/cpp11-user-defined-literal.html
Copyright © 2020-2023  润新知