Существуют лучшие способы перебора ключей std::map
(или любого контейнера, для которого value_type
равен pair<T,U>
), а именно Boost.Range 'map_keys
*Адаптер 1008 * (есть также map_values
one):
#include <boost/range/adaptor/map.hpp>
#include <utility>
#include <vector>
#include <iostream>
int main(){
typedef std::pair<int, int> Pair;
std::vector<Pair> v {Pair(1,2), Pair(2,3)};
for(auto& first : v | boost::adaptors::map_keys){
std::cout << first << " ";
}
}
Но вернемся к вашей проблеме: все библиотеки Boost используют функцию Boost.Utility result_of
, который по любой причине не вернется к std::result_of
, а также не будет использовать decltype
, если он доступен без вашего ведома.Вы делаете это, помещая #define BOOST_RESULT_OF_USE_DECLTYPE
перед первым включением Boost.
Это, тем не менее, не позволило компилировать ваш код с Clang 3.1 SVN + libc ++.Вот код, который я использовал:
#define BOOST_RESULT_OF_USE_DECLTYPE
#include <boost/iterator/transform_iterator.hpp>
#include <utility>
#include <vector>
#include <functional>
int main(){
typedef std::pair<int, int> Pair;
std::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);
}
Скомпилировано с:
clang++ -std=c++0x -stdlib=libc++ -Wall -pedantic -Ipath/to/boost -Wno-mismatched-tags t.cpp
GCC 4.7, кажется, принимает это очень хорошо, поэтому я предполагаю, что это ошибка в libc ++.