在boost :: lambda中使用boost ::格式
-
09-10-2019 - |
题
由于某种原因,我无法使用 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。凉爽的是,上面的第二种用途将 默默 失败。
我知道,有点违反直觉,但这就是事实。
不隶属于 StackOverflow