gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:27 26 4
gpt4 key购买 nike

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

我有一个通用的简写仿函数 util::shorthand::pair_secondutil::shorthand::pair_first它返回一对中的第二个和第一个项目。

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

-1.second模板化类型为 Connection<T> .我不能使用 C++11

最佳答案

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

关于您正在使用的类型,我没有足够的信息,但是像这样的东西应该可以工作:

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

注意:此示例中的 bindboost::lambda 命名空间中的那个,而不是 Boost.Bind。

编辑:完整的、可编译的示例:

#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;
}

关于c++ - 在 boost::lambda 中表达 _1.second->pair().first == r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12026884/

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