boost :: format in a boost :: lambdaを使用します
-
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
実際にはaです boost::fusion::for_each
).
解決
何らかの理由で、あなたのコードは評価します boost::format("%10d") % bl::_1
ラムダの各呼び出しではなく、すぐに。
これを防ぐには、包む必要があります 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 dに置き換えます。よりクールなことは、上記の2番目の使用が 静かに 不合格。
私は知っている、一種の直感に反するものですが、それが何であるかです。