【问题标题】:Using Boost Bind with std::Transform将 Boost Bind 与 std::Transform 一起使用
【发布时间】:2020-08-03 13:35:24
【问题描述】:

我不确定带有boost::bind 的以下代码 sn-p 在这里做什么:

//..
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));
//..

ExchangeMapstd::map&lt;int, Instrument::Exchange&gt; 的类型定义。

我阅读了以下documentation,但没能找到。我假设 &amp;ExchangeMap::value_type::second 扩展为 ExchangeMap::pair&lt;const int, Instrument::Exchange&gt;::second 因此指向 Instrument::Exchange?

【问题讨论】:

    标签: c++ boost stl bind


    【解决方案1】:

    &amp;ExchangeMap::value_type::secondExchangeMap::value_typepointer to a (data) member(即std::pair&lt;const int, Instrument::Exchange&gt;)。

    boost::bind(和std::bind)采用任何invokable 值,包括指向成员的指针。对于指向数据成员的指针,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(按键排序)

    【讨论】:

    • 所以让我确认一下,我们有一个指向数据成员的指针,在这种情况下是映射中所有键的值。但是为什么_1 占位符?这是否与您上面讨论的*this 有某种关系?
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2016-04-22
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多