zoukankan      html  css  js  c++  java
  • 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文件中。

  • 相关阅读:
    luogu P1833 樱花 看成混合背包
    luogu P1077 摆花 基础记数dp
    luogu P1095 守望者的逃离 经典dp
    Even Subset Sum Problem CodeForces
    Maximum White Subtree CodeForces
    Sleeping Schedule CodeForces
    Bombs CodeForces
    病毒侵袭持续中 HDU
    病毒侵袭 HDU
    Educational Codeforces Round 35 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/tocy/p/cpp11-user-defined-literal.html
Copyright © 2011-2022 走看看