gpt4 book ai didi

c++ - 解引用迭代器作为 boost::bind 复合链的一部分

转载 作者:行者123 更新时间:2023-11-28 03:19:19 24 4
gpt4 key购买 nike

我正在尝试使用绑定(bind)来生成一个函数:

  • 收到一张 map m
  • 返回 m.begin()->first

为此我尝试使用 boost::bind:

typedef map<int,int>::const_iterator (map<int,int>::*const_begin_end) () const;
bind(&pair<const int,int>::first, bind(static_cast<const_begin_end>(&map<int, int>::begin), _1));

这不起作用,因为开始的结果需要取消引用。我想到了类似的东西

bind(&pair<const int,int>::first, bind(&operator*, bind(static_cast<const_begin_end>(&map<int, int>::begin), _1)));

但这行不通,因为没有全局运算符*。

问题:

  • 是否可以使用 boost::bind 复合链来实现?怎么样?
  • 更容易阅读的替代品?

最佳答案

我强烈推荐Boost.Phoenix ,当涉及到在 C++03 中动态编写仿函数时,它是我的首选库。它是 Boost.Bind 的一个更好的替代品——那个库正在显示它的年龄。

例如,Phoenix 允许我们在其仿函数上使用运算符来表示调用仿函数时对该运算符的实际使用。因此 arg1 + arg2是一个仿函数,返回其前两个操作数之和。这大大减少了 bind噪音。第一次尝试可能是这样的:

bind(&pair<const int, int>::first
, *bind(static_cast<const_begin_end>(&map<int, int>::begin), arg1)) )

( LWS demo )

但 Phoenix 的另一个优点是它配备了一些电池。在我们的案例中,我们对 <boost/phoenix/stl/container.hpp> 非常感兴趣因为这包括一些熟悉的容器操作的惰性版本,包括 begin .这在我们的例子中非常方便:

// We don't need to disambiguate which begin member we want anymore!
bind(&pair<const int, int>::first, *begin(arg1))

( LWS demo )


作为最后的说明,我将添加 C++11 绑定(bind)表达式的指定,这样指向成员的指针可以在使用 operator*任何上工作。 .所以开箱即用,你可以这样做:

bind(&pair<const int, int>::first, bind(static_cast<begin_type>(&std::map<int, int>::begin), _1))

( LWS demo )

关于c++ - 解引用迭代器作为 boost::bind 复合链的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15931942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com