C++ 无法转换boost::lambda::占位符1\u类型
我试图使用boost::lambda,但遇到了一个无法解决的错误 我觉得这是一个初学者的错误,所以请原谅我的无知(并且,我必须承认,我没有阅读整个boost-lamda文档也很懒惰) 在某些情况下,使用boost::bind(或者boost::lambda::bind?)似乎比boost::lambda更合适,但我不确定它是否可以在这里应用。我不想为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
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