我有一个表达式,我需要将std::transform
作为回调放入,但我不想为它编写另一种方法。我想将_1.second->pair().first == r
表达为boost::lambda
,假设_1
是传递给std::pair
我有一个通用的速记仿函数util::shorthand::pair_second
和util::shorthand::pair_first
,它会返回一对中的第二项和第一项。
我可以做boost::bind(util::shorthand::pair_second, _1)
然后做什么?如何实现表达式的其余部分?
-1.second
的模板类型为Connection<T>
。我无法使用C ++ 11
答案 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
注意:此示例中的bind
是boost::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}}