我正在考虑将我的代码迁移到使用C++ 11风格的lambda而不是bind到处都有.但我不确定这是不是一个好主意.
使用eg boost::lambda(或boost::phoenix)是否比C++ 11风格的lambdas有任何实际优势?
搬到lambdas是个好主意吗?我应该迁移我的代码吗?
我试图理解这些不同绑定方法之间的区别.boost :: bind和boost :: phoenix :: bind也有类似的问题
但是,如果有人能用例子来解释这一点,那就太好了.也就是说,boost :: phoenix是boost :: bind,booost :: lambda库的超集吗?
考虑下面的C++ 0x代码:
a_signal.connect([](int i) {
if(boost::any_cast<std::string>(_buffer[i]) == "foo")
{
base_class<>* an_object = new derived_class();
an_object->a_method(_buffer[i]);
}});
Run Code Online (Sandbox Code Playgroud)
如何在Boost Lambda中正确查看(因为此C++ 0x功能尚未在GCC 4.4中使用)?
我最近开始关注boost phoenix,作为lambda的替代品.凤凰是lambda的完全替代品,还是凤凰城没有提供一些lambda功能?是凤凰成熟吗?有什么问题我应该知道吗?
我的主要兴趣是操作员组成,控制语句和演员表不那么重要
谢谢
我有两个向量.
vector<Object> objects;
vector<string> names;
Run Code Online (Sandbox Code Playgroud)
填充这两个向量并具有相同的大小.我需要一些算法来分配对象变量.它可以使用boost :: lambda.让我们说:
some_algoritm(objects.begin(), objects.end(), names.begin(), bind(&Object::Name, _1) = _2);
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我有std::map<int, std::pair<short, float> >,我需要short在这张地图中找到最小值.我该怎么boost::bind用std::min_element()?
boost::lambda?
我可以看到Boost有两个不同的绑定库,一个是"独立的",可以通过包含使用boost/bind.hpp,另一个通过包含使用boost/lambda/bind.hpp.这两者有什么区别?
<更新>像我一样,问题是错误的.实际问题是:为什么transform_iterator不使用传统的result_of <>元函数来确定返回类型,而不是直接访问UnaryFunc :: result_type.通过解决方案发表答案. </更新>
具体来说,有没有办法让phoenix表达式暴露出result_typestd :: unary_function概念所期望的类型?boost :: transform_iterator似乎期待这个,并且通过查看它的src,我看不到简单的解决方法.
这里有一些代码可以重现我一直遇到的问题:
#include <boost/iterator/transform_iterator.hpp>
#include <boost/spirit/home/phoenix.hpp>
#include <numeric>
#include <iostream>
using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;
int main(void){
int i[] = {4,2,5,3};
std::cout <<
std::accumulate(
boost::make_transform_iterator(i, _1*_1),
boost::make_transform_iterator(i+4, _1*_1),
0
) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它的错误消息的相关部分是(gcc 4.3.4,boost 1.43):
/usr/include/boost/iterator/transform_iterator.hpp:43: error: no type named ‘result_type’ in ‘struct boost::phoenix::actor<...
Run Code Online (Sandbox Code Playgroud)
我对boost :: lambda(缺失result_type)有同样的问题.我以为我过去看过make_transform_iterator和lambda的类似用法,现在我想知道我是不是想象它.
是否有一个提供的包装器或凤凰或lambda中的其他机制来暴露result_type?
出于某种原因,我无法使用boost::format的boost::lambda.这是(希望)可编译的代码简化:
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <boost/assign/list_of.hpp>
#include <boost/format.hpp>
#include <boost/lambda/lambda.hpp>
namespace bl = boost::lambda;
int main()
{
const std::vector<int> v = boost::assign::list_of(1)(2)(3);
std::for_each(v.begin(), v.end(), bl::var(std::cout) << std::setw(10) << bl::_1);
std::for_each(v.begin(), v.end(), bl::var(std::cout) << boost::format("%10d") % bl::_1);
}
Run Code Online (Sandbox Code Playgroud)
std::for_each产生预期的输出std::for_each只输出没有任何数字的空格这是为什么 ?我真的不熟悉boost::lambda所以我可能会错过这里明显的.
请不要建议std::copy基于答案:我的实际代码不起作用,std::vector但实际上是boost::fusion::vector(并且std::for_each实际上是a boost::fusion::for_each).
什么是使用boost lambda库开始编程的最佳方法.