Использование Boost Bind с std :: Transform - PullRequest
1 голос
/ 21 апреля 2020

Я не уверен, что здесь делает следующий фрагмент кода с boost::bind:

//..
Instrument::Exchanges e; 
// typedef for std::vector<Instrument::Exchange>

std::transform(exchangeMap_.begin(), exchangeMap_.end(),
std::back_inserter(e), 
boost::bind(&ExchangeMap::value_type::second, _1));
//..

ExchangeMap - это typedef для std::map<int, Instrument::Exchange>.

Я прочитал следующая документация , но потерпела неудачу. Я предполагаю, что &ExchangeMap::value_type::second расширяется до ExchangeMap::pair<const int, Instrument::Exchange>::second, следовательно, указатель на Instrument::Exchange?

1 Ответ

1 голос
/ 21 апреля 2020

&ExchangeMap::value_type::second - это указатель на (данные) члена из ExchangeMap::value_type (что std::pair<const int, Instrument::Exchange>).

boost::bindstd::bind ) принимает любое вызываемое значение , включая указатель на элементы. Для указателя на элементы данных invoke принимает значение для *this и возвращает значение для этого элемента (т.е. все значения pair_object.second).

Например:

using pair_type = std::pair<const int, char>;

pair_type pair{ 0, 'a' };
char pair_type::* ptr = &pair_type::second;

std::invoke(ptr, pair) == 'a';
&std::invoke(ptr, pair) == &pair.second;

Так что std::bind просто делает его вызываемым (в традиционном смысле operator()) для передачи в std::transform и вставляет все значения карты в e (упорядоченный по ключу)

...