2012-08-30 74 views
3

所以這裏是我想要做的:我使用std::pair,但是我一定會喜歡用元組來做同樣的事情,或者實際上幾乎任何一種模板。當分配對變量,我需要鍵入類似:使用模板時的類型推斷

T1 t1; 
T2 t2; 
std::pair<T1,T2> X; 
X = std::pair<T1,T2> (t1, t2); 

是否有辦法創造新的對時省略第二<T1,T2>,並讓編譯器的猜測,或者使用X的類型(我顯然試圖創建一個pair<T1,T2>)或t1t2的類型(我正與T1對象和T2對象建立一對,我想要的對是否有類型pair<T1,T2>)?

回答

4

是的,但是模板實參推演僅適用於函數模板,而不是類模板的構造函數。出於這個原因,所述庫提供了一個功能:

X = std::make_pair(t1, t2); 

在C++ 11,對和元組可被初始化,並從初始化劑列出分配:

X = {t1, t2}; 

auto可以被用於自動地指定因此你根本不需要指定模板參數:

auto X = std::make_pair(t1, t2); 
+0

您是否知道模板參數演繹不允許用於構造函數的原因? –

+0

@Hephaestos:我不知道原因,但我認爲在一般情況下推導它們可能非常困難,如果不是不可能的話,因爲不同的類模板特化可以有不同的構造函數集。雖然這只是一個猜測, –

3
std::pair<T1,T2> X = std::make_pair(t1, t2); 

C++11

std::pair<T1, T2> X = {t1, t2}; 

C++11

auto X = std::make_pair(t1, t2); 

而對於std::tuplestd::make_tuple

+2

爲什麼'std :: pair x(t1,t2);'?這對於C++ 11來說應該沒問題。 – Nobody

+0

@沒有人會,OP分配給''X'',這個答案全部是關於聲明和初始化的,這在這裏是無關緊要的。 – juanchopanza

4

是,使用std::make_pair

std::pair<T1,T2> X; 
// some code 
X = std::make_pair(t1, t2); 

或者,如果你可以直接初始化:

std::pair<T1,T2> X = std::make_pair(t1, t2); // OR, even better: 
std::pair<T1,T2> X(t1, t2); 

對於C++ 11初始化甚至更好:

auto X = std::make_pair(t1, t2); 

作業是一樣的:

X = std::make_pair(t1, t2); 

,但它也可能是:

X = { t1, t2 }; 
+0

OP分配給''X'',而不是複製 - 初始化,所以''auto''不適用(但對於瞭解它肯定有用)。 – juanchopanza

+0

@ juanchopanza - 採取了一點,我擴大了答案一點。 –

+0

謝謝你,答案就在我鼻子下面,正如我預期的那樣:D –