Имеется код, который работает в C++11:
#include <algorithm>
#include <iostream>
#include <vector>
#include <utility>
#include <iterator>
typedef std::pair<void*, int> pair;
int main(){
std::vector<pair> s;
std::vector<int> r;
pair p1(NULL, 42);
pair p2(NULL, 100500);
s.push_back(p1);
s.push_back(p2);
std::transform(s.begin(), s.end(), std::back_inserter(r), static_cast<const int&(*)(const pair&)>(std::get<1>));
std::copy(r.begin(), r.end(), std::ostream_iterator<int>(std::cout, " "));
}
Вывод:
42 100500
Хочется реализовать подобное в C++03 без использования пользовательского функтора/функции типа:
struct F {
int operator()(const pair& p) { return p.second; }
};
или
int f(const pair& p) { return p.second; }
и вызова вида:
std::transform(s.begin(), s.end(), std::back_inserter(r), F());
Можно ли это сделать с помощью цепочки готовых библиотечных адаптеров? std::get в C++03 ещё не было.
Использовать ручной цикл for вместо transform также не хочется, т.к. это влечёт за собой упоминание типов итераторов, да и не для того алгоритмы придуманы, чтобы вручную циклы писать.
Международное сообщество SO говорит, что нет стандартных функций для получения first и second членов std::pair в С++03. Как следствие, нет возможности и решить поставленную задачу. Всем спасибо за участие :)
#include <algorithm>
#include <iostream>
#include <vector>
#include <utility>
#include <iterator>
typedef std::pair<void*, int> pair;
struct F {
int operator()(const pair& p) { return p.second; }
};
int main(){
std::vector<pair> s;
std::vector<int> r;
pair p1 = std::make_pair<void*, int>(NULL, 42);
pair p2 = std::make_pair<void*, int>(0, 100500);
s.push_back(p1);
s.push_back(p2);
std::transform(s.begin(), s.end(), std::back_inserter(r), F());
std::copy(r.begin(), r.end(), std::ostream_iterator<int>(std::cout, " "));
}
Компилятор MSVC 2010
Вывод:
42 100500
Сборка персонального компьютера от Artline: умный выбор для современных пользователей