C++11新特性之自定義字面量
1.示例
C++11新標(biāo)準(zhǔn)中引入了用戶自定義字面量,也叫自定義后綴操作符,即通過實(shí)現(xiàn)一個(gè)后綴操作符,將申明了該后綴標(biāo)識(shí)的字面量轉(zhuǎn)化為需要的類型??疾烊缦麓a:
long double operator"" _mm(long double x) { return x / 1000; }
long double operator"" _m(long double x) { return x; }
long double operator"" _km(long double x) { return x * 1000; }
int main()
{
cout << 1.0_mm << endl; //0.001
cout << 1.0_m << endl; //1
cout << 1.0_km << endl; //1000
return 0;
}
編譯并運(yùn)行:
0.001
1
1000
實(shí)際上,自定義字面量一般用于用戶自定義的構(gòu)造類型(結(jié)構(gòu)體與類)。假如入我們有如下一個(gè)表示顏色的類。
struct RGBA
{
uint8_t r, g, b, a;
RGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a):r(r),g(g),b(b),a(a){}
};
如何書寫類RGBA的字面量值呢,我們需要實(shí)現(xiàn)自定義后綴操作符。
RGBA operator"" _RGBA(const char* str, size_t size)
{
const char* r = nullptr, *g = nullptr, *b = nullptr, *a = nullptr;
for (const char* p = str; p != str + size; ++p)
{
if (*p == 'r') r = p + 1;
if (*p == 'g') g = p + 1;
if (*p == 'b') b = p + 1;
if (*p == 'a') a = p + 1;
}
if (r == nullptr || g == nullptr || b == nullptr) throw;
if (a == nullptr)
{
return RGBA(atoi(r),atoi(g),atoi(b),0);
}
else
{
return RGBA(atoi(r), atoi(g), atoi(b),atoi(a));
}
}
這里需要注意的是后綴操作符函數(shù)根據(jù)C++ 11 標(biāo)準(zhǔn),只有下面參數(shù)列表才是合法的:
char const * unsigned long long long double char const *, size_t wchar_t const *, size_t char16_t const *, size_t char32_t const *, size_t
最后四個(gè)對(duì)于字符串相當(dāng)有用,因?yàn)榈诙€(gè)參數(shù)會(huì)自動(dòng)推斷為字符串的長度。例如:
size_t operator"" _len(char const * str, size_t size)
{
return size;
}
int main()
{
cout << "mike"_len <<endl; //結(jié)果為4
return 0;
}
完成自定義后綴操作符函數(shù)后,我們可以使用自定義字面量來表示一個(gè)RGBA的對(duì)象了。
//輸出運(yùn)算符重載
ostream& operator<<(ostream& os,const RGBA& color)
{
return os<<"r="<< (int)color.r<<" g="<< (int)color.g<<" b="<< (int)color.b<<" a="<< (int)color.a<<endl;
}
int main()
{
//自定義字面量來表示RGBA對(duì)象
cout << "r255 g255 b255 a40"_RGBA << endl;
return 0;
}
程序編譯運(yùn)行輸出:
r=255 g=255 b=255 a=40
總體來說,用戶自定義字面量為代碼書寫帶來了極大的便利。在實(shí)現(xiàn)自定義后綴操作符函數(shù),后綴建議使用下劃線開頭,不宜使用非下劃線的用戶自定義字符串常量,否則編譯器會(huì)發(fā)出警告。因?yàn)槿绻赜眯稳?019UL這樣的字面量,后綴"UL"與C++的類型"后綴"相同,無疑會(huì)引起一些混亂。
以上就是C++11新特性之自定義字面量的詳細(xì)內(nèi)容,更多關(guān)于c++ 自定義字面量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Visual Studio Code運(yùn)行C++代碼時(shí)顯示CLOCKS_PER_SEC未定義的問題及解決方法
- C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解
- 在編程語言中怎樣定義隊(duì)列及其使用(C++)
- c/c++中struct定義、聲明、對(duì)齊方式解析
- C/C++語言中全局變量重復(fù)定義問題的解決方法
- 舉例說明自定義C++異常處理的實(shí)例
- C++中的聚合類定義與用法分析
- C++ 自定義棧實(shí)現(xiàn)迷宮求解
- 區(qū)分c++中的聲明與定義
相關(guān)文章
C/C++函數(shù)參數(shù)傳遞機(jī)制詳解及實(shí)例
這篇文章主要介紹了C/C++函數(shù)參數(shù)傳遞機(jī)制詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
線程崩潰不會(huì)導(dǎo)致?JVM?崩潰的原因解析
網(wǎng)上看到一個(gè)很有意思的據(jù)說是美團(tuán)的面試題:為什么線程崩潰崩潰不會(huì)導(dǎo)致?JVM?崩潰,這個(gè)問題我看了不少回答,但都沒答到根本原因,所以決定答一答,相信大家看完肯定會(huì)有收獲,本文分以下幾節(jié)來探討,需要的朋友可以參考下2022-06-06
C語言實(shí)例問題探究字符串函數(shù)的應(yīng)用
字符串函數(shù)(String processing function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長度,字符查找等的函數(shù)2022-04-04
C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明
這篇文章主要介紹了C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

