你可能會感興趣的 5 個隱藏的 C++ 語言特性

jopen 10年前發布 | 6K 次閱讀 C/C++

一天又一天,C++ 是越來越火起來了. 作為一種范式覆蓋語言,C++的這些隱藏特性基本上就基本上只是對其現有的基礎設施的靈活使用. 其實還有更多的這樣的設施,而我們也樂于聽見讀者對此能夠有所補充.

#1. 眾所周知的三元運算符 (?:), 許多人并沒有意識到它可以作為左值來使用.

x = (y < 0) ? 10 : 20;
(a == 0 ? a : b) = 1;

不這樣的話,你就只能得像下面這樣寫了, 

if (a == 0)
a = 1;
else
b = 1;

#2.  命名空間別名這一特性你也可能會很容易的錯過. 一旦你了解了它,你就會認識到它是無所不在的. 當你在在編寫一端帶有許多命名空間層級結構的大型代碼時,它是特別的有用啊. 

namespace x = boost::filesystem;

x::path myPath(strPath, fs::native );

#3.  變量并不是唯一能夠在函數的初始部分被聲明的東西. 你也可以聲明類和其它的函數.

for(struct { int x; float y; } loop = { 1, 2 }; ...; ...) {
...
}

#4.    一元的 + 運算符可以被用來增進或者消退某些東西的量. 見下面的一些示例.

+EnumeratorValue: 這能給予你的枚舉值一個完美的整形, 其能讓枚舉值適合它的值. 這在實現針對枚舉的操作符重載時相當的有用.

向變量傳遞一個臨時的值: 你可以為使用這個操作符的變量創建一個臨時的值. 例如,如果你有一個使用了一個沒有任何外部的類定義的內部的類靜態初始化器的類,但有時系統會鏈接失敗,這樣的類的話.

struct Foo {
static int const value = 42;
};

template
void f(T const&);

int main() {
// fails to link and tries to get the address of "Foo::value"!
f(Foo::value);

// works - pass a temporary value
f(+Foo::value);
}

遞減一個數組的指針: 操作符也能在你想要傳遞兩個值到一個函數中時起作用.

template
void f(T const& a, T const& b);

int main() {
int a[2];
int b[3];
f(a, b); // won't work! different values for "T"!
f(+a, +b); // works! T is "int*" both time
}

#5 . 你必須知道有 id/標識 的元函數。現在就看看這個針對他的用例吧,其適用于沒有模板的情況.

// void (*f)(); // same
id::type *f;

// void (*f(void(*p)()))(int); // same
id::type *f(id::type *p);

// int (*p)[2] = new int[10][2]; // same
id::type *p = new int[10][2];

// void (C::*p)(int) = 0; // same
id::type C::*p = 0;

It helps decrypting C++ declarations greatly!

//幾乎跟 boost::identity 是一樣的
template 
struct id { typedef T type; };

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!