2013-08-17 38 views
2

std::get函數使用模板參數作爲常規參數。
作爲一個例子:爲什麼std :: get使用模板參數而不是常規參數?

std::tuple <int, double, long &, const char *> bar(18, 6.5, 12, "Hello!"); 
cout << std::get<2>(bar); // Print the tuple’s third element. 

爲什麼此功能設計的這種方式?
爲什麼不使用常規參數呢?
例如,類似於:std::get(bar, 2)std::get(2, bar)

+0

元組是一個編譯時構造。 – Rapptz

回答

10

函數必須具有定義良好的返回類型,在編譯時指定。這裏模板專門化get<2>是一個返回long&的函數;但是你的版本將不得不返回一個不同的類型,這取決於它在運行時指定的參數,這是不可能的。

+0

我不知道是否有人提議像'std :: visit'這樣的東西,沒有什麼東西立刻出現在我的搜索中。這對未來的'std :: variant'也很有效。 – GManNickG

5

希望這個示範是不夠的解釋:

int x; 
std::cin >> x; 
auto i = std::get(bar, x); 

牢記在C++中的任何對象的類型必須在編譯時是已知的,是什麼類型i?請注意,您不能將變量作爲模板參數傳遞,您必須傳遞常量表達式,因此當整數是模板參數時,上述問題不存在。

也許與你的例子更相關的是這個。

std::cout << std::get(bar, x); 

operator<<的每個過載是一個不同的功能。根據參數在編譯時確定調用哪個函數。那麼編譯器如何確定在上面的語句中調用哪個重載?如果你有一個甚至沒有超載的元組成員呢?

相關問題