3

我正在尝试使用 boost::lambda,但遇到了一个错误,我无法弄清楚如何解决。

我觉得这是一个初学者的错误,所以请原谅我的无知(而且,我不得不承认,我也懒惰地没有阅读整个 boost lamda 文档)。

似乎在某些情况下使用 boost::bind(或者 boost::lambda::bind?),比 boost::lambda 更适合,但我不确定它是否可以在这里应用。我不想为 编写单独的函数if cond(arg1) arg2.insert(arg1) ;,因为它会破坏目的;我猜它不会比函子好多少。

我在工作中使用带有 VC9 的 boost 1.35。错误位于cond()insert()调用站点:“C2664:无法从 'boost::lambda::placeholder1_type”转换参数 1

我在我的 cygwin 上用 g++ 复制了这个片段的问题。

#include <boost/function.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/if.hpp>

#include <boost/foreach.hpp>
#include <iostream>
#include <set>

void work(  boost::function<void(long)> doAction ) {
    long results[] = { 2, 5, 4 };
    BOOST_FOREACH( long r, results )
        doAction( r );
}

bool cond( long r ) { return r % 2 == 0 ; }

int main() {
    using namespace boost::lambda;
    std::set<long> myResults;
    work( 
        if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );

    BOOST_FOREACH( long r, myResults )
        std::cout << r << "\n";
}

g++ 错误:

lambda_test.cpp: In function ‘int main()’:
lambda_test.cpp:21:19: error: cannot convert ‘boost::lambda::placeholder1_type {aka const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >}’ to ‘long int’ for argument ‘1’ to ‘bool cond(long int)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );
               ^
lambda_test.cpp:21:60: error: no matching function for call to ‘std::set<long int>::insert(boost::lambda::placeholder1_type&)’
if_then( cond(_1) , boost::ref(myResults).get().insert(_1) ) );

任何帮助,将不胜感激,

谢谢

4

1 回答 1

1

您将延迟执行与立即评估混合在一起:

boost::ref(myResults).get().insert(_1)

在这里,boost::ref(myResults)不是懒惰,所以.get()也不是。的类型boost::ref(myResults).get()just std::set<long> &,并且该类型的insert成员函数没有采用 Boost Lambda 占位符的重载。

我不再精通 Boost Lambda,因为我已经移到了它的后继库 Boost Phoenix。这是带有修复的一对一翻译:Live On Coliru

#include <boost/phoenix.hpp>

#include <boost/foreach.hpp>
#include <iostream>
#include <set>

template <typename Action>
void work(  Action doAction ) {
    long results[] = { 2, 5, 4 };
    BOOST_FOREACH( long r, results )
        doAction( r );
}

bool cond( long r ) { return r % 2 == 0 ; }


int main() {
    namespace phx = boost::phoenix;
    using namespace phx::placeholders;

    std::set<long> myResults;
    work( 
        if_(phx::bind(cond, _1)) [ phx::insert(phx::ref(myResults), _1) ] );

    BOOST_FOREACH( long r, myResults )
        std::cout << r << "\n";
}

印刷

2
4

我建议查看 Phoenix 函数适配,以避免绑定表达式:

于 2014-05-12T11:33:36.093 回答