2010-12-07 20 views
5

何らかの理由でboost::lambdaboost::formatを使用できません。boost :: lambdaでboost :: formatを使用する

#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あります)。

答えて

4

ラムダを呼び出すたびにではなく、何らかの理由でコードでboost::format("%10d") % bl::_1がすぐに評価されます。

これを防ぐには、std::coutと同じように、bl::varへのコールでboost::format("%10d")を折り返す必要があります。

残念ながら、これを行うには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)); 
+0

うん、これは動作しますが、なぜそれが必要なのかわかりません! 'boost :: lambda :: var'はどちらの引数もラムダ式でない場合にのみ必要です。私は 'boost :: lambda'を使ってすてきで簡潔な構文を目指していました:(やや悪い – icecrime

2

私の考えは、使用しているフォーマットがもはや使用できないという事実にぶつかっていることです。

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

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

つまり、フォーマットで%を使用すると、実際に文字列データが%dに置き換えられます。クーラーの問題は、上記の2番目の使用はサイレントが失敗することです。

私は知っているが、直感的ではありませんが、それはそのとおりです。

+0

は、あなたの答えをありがとう、私は期待どおりに作品を提供したコードを信じています。 boost.formatドキュメンテーションを引用する "すべての引数が与えられたら、フォーマットオブジェクトをストリームにダンプすることができます。[...]結果の文字列は、別の引数が渡されるまでformatオブジェクトでアクセス可能な状態になり、再初期化されます。 " 2番目の '%'は実際にフォーマットを再初期化しますが、それは私の場合には良いことです! – icecrime

+0

私の経験ではそれはありませんが、もしあなたの穀物が変わるなら私は私の反応を無視することを提案します。あなたの問題が他にどのようなものか分かりません。 –

関連する問題