在boost :: lambda中表达_1.second-> pair()。first == r

时间:2012-08-19 13:34:19

标签: c++ boost boost-lambda

我有一个表达式,我需要将std::transform作为回调放入,但我不想为它编写另一种方法。我想将_1.second->pair().first == r表达为boost::lambda,假设_1是传递给std::pair

类型的唯一参数

我有一个通用的速记仿函数util::shorthand::pair_secondutil::shorthand::pair_first,它会返回一对中的第二项和第一项。

我可以做boost::bind(util::shorthand::pair_second, _1)然后做什么?如何实现表达式的其余部分?

-1.second的模板类型为Connection<T>。我无法使用C ++ 11

1 个答案:

答案 0 :(得分:2)

看看Boost.Lambda bind expressions。您可以使用它们来绑定成员函数和成员数据。

我没有足够的信息来说明您正在使用的类型,但这样的事情应该有效:

bind(&std::pair<S, R>::first,
     bind(&Connection<T>::pair,
          bind(&std::pair<U, Connection<T> >::second, _1))) == r

注意:此示例中的bindboost::lambda命名空间中的#include <algorithm> #include <iostream> #include <utility> #include <vector> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> // http://stackoverflow.com/questions/12026884/expressing-1-second-pair-first-r-in-boostlambda/ typedef int S; typedef int R; template <typename T> struct Connection { std::pair<S, R> pair() const { return std::make_pair(0, 0); } }; int main() { using namespace boost::lambda; typedef int T; typedef int U; std::vector<std::pair<U, Connection<T> > > vec; vec.push_back(std::make_pair(3, Connection<T>())); std::vector<bool> res(vec.size()); int r = 0; std::transform(vec.begin(), vec.end(), res.begin(), bind(&std::pair<S, R>::first, bind(&Connection<T>::pair, bind(&std::pair<U, Connection<T> >::second, _1))) == r); std::vector<bool>::iterator it, end = res.end(); for (it = res.begin(); it != end; ++it) { std::cout << ' ' << *it; } std::cout << std::endl; } ,而不是Boost.Bind。

编辑:完整,可编辑的示例:

{{1}}