天天看點

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

原文來自:http://news.html5tricks.com/5-hidden-cpp-features.html

一天又一天,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);

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

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

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 是一樣的

struct id { typedef T type; };

繼續閱讀