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文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM