由于某种原因,我无法使用 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);
}
  • 首先 std::for_each 产生预期的输出
  • 第二 std::for_each 仅输出空格没有任何数字

这是为什么 ?我真的不熟悉 boost::lambda 因此,我可能会在这里错过显而易见的事情。

请不要建议 std::copy 基于答案:我的实际代码不起作用 std::vector 但是继续 boost::fusion::vector (和 std::for_each 实际上是 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));

其他提示

我敢打赌,您遇到了一个事实,即使用的格式不再可用。

boost::format f("...");

std::string s = f % ... ;
std::string s2 = f % other options...; // FAIL!  f has been changed by the above use!

换句话说,在格式上使用%实际上将字符串数据替换为您的%d。凉爽的是,上面的第二种用途将 默默 失败。

我知道,有点违反直觉,但这就是事实。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top