傳統的任務迭代谷鍵集std::map
導致我另一個混亂,似乎還沒有在這裏討論。boost :: transform_iterator不適用於std :: bind(&Pair :: first,_1)?
總之,這代碼不編譯(C++ 11被大量使用):
typedef std::pair<int, int> Pair;
vector<Pair> v {Pair(1,2), Pair(2,3)};
using namespace std::placeholders;
auto choose_first = std::bind(&Pair::first, _1);
boost::make_transform_iterator(v.begin(), choose_first);
錯誤消息如下。
no type named 'result_type' in 'struct std::_Bind<std::_Mem_fn<int std::pair<int, int>::*>(std::_Placeholder<1>)>'
同時,改變std::bind
到boost::bind
解決問題。但是我的項目中有一個代碼約定,我們只使用std::bind
。
有什麼建議該怎麼做? (我應該向Boost團隊寫錯誤報告嗎?)
至於map_keys:實際上在最後我使用了一些通用函數,它接受滿足STL容器要求(begin(),end())的對象。所以在創建轉換迭代器之後,我將它們打包到boost :: iterator_range中並將其提供給我的函數。我無法弄清楚,如何更快地做到這一點。 BOOST_RESULT_OF_USE_DECLTYPE在Boost 1.46,GCC 4.6.1中由於某些原因沒有幫助。也許我做錯了什麼...... – 2012-03-22 14:53:35
@Artem:Boost.Range適配器返回的所有範圍都有'begin()'和'end()'成員,否則他們將無法使用range-for,如我所示。 :)所以只要做'your_generic_func(v | map_keys)'。 – Xeo 2012-03-22 14:59:18
非常感謝! 'your_generic_func(v | map_keys)'工作正常! – 2012-03-22 15:10:37