我真的希望你使用std::get
作爲仿函數,因爲它是作爲一個庫函數已經提供!
如果我們能寫這一行,這不是很好嗎!?
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
......但比這更糟糕。你需要消除歧義這get
使用方法:
int main() {
std::vector<int> items;
std::vector<std::pair<int, int>> pairs;
pairs.push_back(std::make_pair(1, 3));
pairs.push_back(std::make_pair(5, 7));
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
(const int& (*)(const std::pair<int, int>&))std::get<0>);
return 0;
}
的問題是,std::get
is overloaded取1 pair&
,2 const pair&
和3 pair&&
作爲參數,使之適用於任何類型的對工作作爲輸入。不幸的是,重載得到的模板類型扣除std::transform
的方式,所以我們最初的訂單
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
產量
error: no matching function for call to ‘transform(std::vector<std::pair<int, int> >::iterator, std::vector<std::pair<int, int> >::iterator, std::back_insert_iterator<std::vector<int> >, <unresolved overloaded function type>)’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
^
...
/usr/include/c++/4.8/bits/stl_algo.h:4915:5: note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘_UnaryOperation’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
它不知道你是問推導當其中std::get
超載std::transform
的模板,所以你必須手動指定它。將函數指針轉換爲正確的類型告訴編譯器:「嘿,請使用超載,其中get
需要const&
並返回const&
!」
但至少我們使用的是標準庫組件(yay)?
而且在線路的數量方面,它並不比其他選擇更糟糕: http://ideone.com/6dfzxz
任何人都可以想到任何改進?能夠像這樣乾淨地使用'std :: get'會很棒。 ...真的,我應該使用'reinterperet_cast&)>(std :: get <0>)',但那似乎更糟糕... –
NHDaly
2015-08-14 01:19:39
我認爲它可以用包裝在一個lambda表達式中的get函數來替換「hard」類型轉換,其中可以指定參數 – 2015-10-29 10:47:22