ice*_*ime 5 c++ boost-lambda boost-format
出于某种原因,我无法使用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::format("%10d") % bl::_1立即计算,而不是在每次调用 lambda 时计算。
为了防止这种情况,您需要包装boost::format("%10d")对 的调用bl::var,就像您对 所做的那样std::cout。
不幸的是,这样做需要 Boost.Lambda 推断出调用的返回类型operator%,但它无法做到这一点。因此,必须使用 显式指定返回类型bl::ret。请注意,此返回类型必须是引用,以便std::cout直接访问返回的对象而不是其副本。
因此,我们得到以下代码,它产生预期的输出:
std::for_each(v.begin(), v.end(), bl::var(std::cout) <<
bl::ret<const boost::format &>(bl::var(boost::format("%10d")) % bl::_1));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |