比较两个用于std算法的pointees的正确方法

时间:2014-03-07 14:37:13

标签: c++ boost lambda

我正在使用boost :: range和boost :: lambda,使用以下示例来比较两个数字并获取具有相同数字的元素。

#include <iostream> 
#include <boost/optional.hpp> 
#include <boost/range/algorithm/find_if.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/utility/compare_pointees.hpp>

template <class Range, class Predicate> 
boost::optional<typename boost::range_value<Range>::type> 
search_for(const Range& r, Predicate pred) 
{ 
      BOOST_AUTO (it, boost::find_if(r, pred));
      if (it == boost::end(r)) 
          return boost::none; 
      return *it; 
 } 


 int main() 
 { 
  int a = 1;
  int b = 2;
  int c = 3;
  int d = 3;

  std::vector<int*> m = {&a, &b, &c}; 
  if (boost::optional<int*> number = 
  search_for(m, boost::equal_pointees(???, &d))) { 
       std::cout << "found:" << (*number.get()) << std::endl; 
  } 
  else { 
       std::cout << "not found" << std::endl; 
   } 
}

我应该在???函数中使用search_for以上的内容?

我相信它可能很简单,但不知道该怎么做。我可以使用boost :: bind或std :: bind2d等进行比较,但正在考虑是否有任何优雅的方法来做到这一点。此外,这个代码示例可以重构为更简单的一个,但我只是在学习。

1 个答案:

答案 0 :(得分:1)

使用boost :: lambda,它看起来像这样:

namespace ll = boost::lambda;

search_for(m, *ll::_1 == d)

这比指向d的指针复杂得多,因此您可以使用equal_pointees