boost lambda的一个问题

cailiujia 2007-08-06 02:05:18
我想根据一个int容器的内容以及一个double容器的内容构造一个Foo容器,于是我使用了如下的代码:但是编译8通过,哪里弄错了?
struct Foo
{
Foo(int i, double d)
{

}
};

int _tmain(int argc, _TCHAR* argv[])
{
using namespace boost::lambda;
std::vector<int> int_vec;
int_vec.push_back(1);
int_vec.push_back(2);

std::vector<double> db_vec;
db_vec.push_back(1.2);
db_vec.push_back(2.3);

std::vector<Foo> foo_vec;

std::transform(int_vec.begin(), int_vec.end(), db_vec.begin(), std::back_inserter(foo_vec), Foo(_1, _2));

return 0;
}

...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cailiujia 2007-08-06
  • 打赏
  • 举报
回复
谢谢哦,今天看了一晚上的lambda的资料,终于会使用这玩意儿了。呵呵。
我的那个问题的正确解法应该是:
std::transform(int_vec.begin(), int_vec.end(), db_vec.begin(), std::back_inserter(foo_vec), bind(constructor<Foo>(), _1, _2));

而我原来的错误写法中,Foo(_1, _2)。因为_1是boost::lambda::placeholder1_type,而Foo构造函数要求的第一个参数是int型,所以编译器不让通过了。这让我明白了在使用boost::lambda的时候,经常会有将lambda表达式直白地表达出来的错误。因此很多地方需要var,constant,constant_ref的帮助,让代码成为一个lambda结构,从而成为一个functor,从而能够编译。
最后惊叹一下boost::lambda,仿照课本上的代码,写了一下:
using namespace boost::lambda;

typedef boost::shared_ptr<base> ptr_type;

typedef std::map<std::string, ptr_type> map_type;

map_type m;
m["An Object"] = ptr_type(new base);
m["Another object"] = ptr_type();
m["Yet Another object"] = ptr_type(new base);

std::for_each
(
m.begin(),
m.end(),
if_then_else
(
!bind(&ptr_type::get, bind(&map_type::value_type::second, _1)),
(
bind(&map_type::value_type::second, _1) = bind(constructor<ptr_type>(), bind(new_ptr<derived>())),
var(std::cout) << "created a new derived for \"" << bind(&map_type::value_type::first, _1) << "\".\n"
),
var(std::cout) << bind(&map_type::value_type::first, _1) << " already has a valid pointer.\n"
)
);

窒息中~
cailiujia 2007-08-06
  • 打赏
  • 举报
回复
好的,谢谢你,我试试
taodm 2007-08-06
  • 打赏
  • 举报
回复
boost文档里的例子
vector<pair<int, int> > v;
transform(x.begin(), x.end(), y.begin(), back_inserter(v),
bind(constructor<pair<int, int> >(), _1, _2));
看boost文档认真一点,看全了再用。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧