1. 程式人生 > >C++ 0x之auto

C++ 0x之auto

引言

曾幾何時,C++ 0x出現在我們眼前,我們還在苦逼的用老的規則寫程式碼,因為我們是碼畜,我們的頂頭上司要求我們必須用土的掉渣的VS2005來寫程式碼,並且用各種存在很棘手問題的庫,還有我們的使用者都用的XP,新的庫包含一些其他的內容,使用者根本都沒法用,所以我們依然苦逼著。不過曙光就在眼前了,雖然沒看到曙光中的女神,但是先感謝下那幫為C++貢獻終生的老頭子們。

auto關鍵字的區分

當年我們學程式設計的時候記得還有一個auto關鍵字,是C++ 98標準的,是用來表明具有自動儲存期的區域性變數,不過這個自動儲存期我是木有明白,這個關鍵字被打入冷宮了。現在那幫old men又重新啟用了它,就像武則天和甄嬛一樣(我又狗血了,為什麼加一個又呢?

)。

現在的auto關鍵字是用來做自動型別推演的,有點類似於型別萃取,不過比型別萃取更簡單更好用。

auto詳細

我們在用模板或者容器的時候經常都會寫一大堆內容來將函式返回值賦值給某個相應的物件,然後用這個物件做一些操作,其實我們根本關心這個物件是什麼型別,我們只是因為不那樣寫編譯器不給通過而已,我們都是被逼的。而現在auto就可以幫我們解決這個煩惱,前面說過了,它的特點是自動型別推演,所以都交給它了。

例如,我們有如下的程式碼:

#include <map>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	typedef std::map<int, int> intMap;
	typedef intMap::iterator intMapIter;

	intMap myIntMap;
	for (intMapIter iter = myIntMap.begin(); iter != myIntMap.end(); ++iter)
	{
		std::cout << "First: " << iter->first 
                        << " Second: " << iter->second << std::endl;
	}

	system("pause");
	return 0;
}

我們寫了這麼一坨程式碼,才實現了一個列印的功能,現在我們可以很簡單的寫了,連typdef都不用,(我認為typedef大多數時候的作用是為了迭代器,而不容器)。

簡單的寫法如下:

#include <map>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::map<int, int> myIntMap;
	for (auto iter = myIntMap.begin(); iter != myIntMap.end(); ++iter)
	{
		std::cout << "First: " << iter->first << " Second: " << iter->second << std::endl;
	}

	system("pause");
	return 0;
}

明顯我們的程式碼量減少了,我們不是按照行數給錢的,所以不用擔心程式碼減少了。

當然了它不僅僅使用在容器上,再看看下面的例子:

#include <string>
#include <iostream>

std::string& GetString(std::string&& myString)
{
	return myString;
}

int _tmain(int argc, _TCHAR* argv[])
{
	auto tempString = GetString(std::string("Hello World"));
	std::cout << tempString << std::endl;
	system("pause");
	return 0;
}

auto關鍵字的好處是解決了長期以來令我們頭疼並且給我們帶來麻煩的返回值資料型別問題。比如在一些複雜的模板函式裡,你可以不用糾結這裡到底用什麼返回值的資料型別,大大的降低了複雜的資料型別的判斷難度和程式碼量。

所以有高階並且簡單的東西為何不用呢,與己方便與人方便嘛。