C++ 无法转换boost::lambda::占位符1\u类型

C++ 无法转换boost::lambda::占位符1\u类型,c++,boost,boost-lambda,C++,Boost,Boost Lambda,我试图使用boost::lambda,但遇到了一个无法解决的错误 我觉得这是一个初学者的错误,所以请原谅我的无知(并且,我必须承认,我没有阅读整个boost-lamda文档也很懒惰) 在某些情况下,使用boost::bind(或者boost::lambda::bind?)似乎比boost::lambda更合适,但我不确定它是否可以在这里应用。我不想为if cond(arg1)arg2.insert(arg1)编写单独的函数,因为它会破坏目的;我想它不会比函子好多少 我在工作中使用了带VC9的bo

我试图使用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::Placeholder 1_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";
}
#包括
#包括
#包括
#包括
#包括
#包括
无效工作(boost::函数doAction){
长结果[]={2,5,4};
BOOST_FOREACH(长r,结果)
doAction(r);
}
布尔条件(长r){返回r%2==0;}
int main(){
使用名称空间boost::lambda;
std::设置我的结果;
工作(
if then(cond(_1),boost::ref(myResults.get().insert(_1));
BOOST_FOREACH(长r,我的结果)

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

boost::ref(myResults).get().insert(_1)
在这里,
boost::ref(myResults)
不是懒惰的,因此
.get()
也不是懒惰的。
boost::ref(myResults.get()
的类型只是
std::set&
,并且该类型的
insert
成员函数没有使用boost Lambda占位符的重载

我不再精通Boost Lambda,因为我已经转移到了它的后续库Boost Phoenix。下面是一个1对1的翻译和修复:

#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";
}
我建议查看Phoenix函数的自适应,以避免bind表达式:


感谢您的及时帮助!很遗憾,我无法更新我们的boost版本,boost::phoenix不在1.35中(但是有boost/spirit/phoenix.hpp)。我可以问你我应该如何修复具有boost 1.35功能的同一代码吗?另一点,我不理解延迟执行与立即求值的混合。因为有占位符,它如何立即求值?它与否无关?你可能可以将同一代码与
\include
(也可以选择
phoenix_语句.hpp
)。BOOST_phoenix_ADAPT_功能将不可用then@unagi关于“混淆”,我在回答中扩展了我的解释。我以前忘记了。真的!谢谢你的解释。@unagi我认为应该有效,但这真的很糟糕,也许sehe会知道一种更有效的方法“可口”。(添加链接使其更有用:)。PS:更好。
#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