2011-07-06 6 views
1

boost::lambdaを使用して簡単な述語を作成しようとしていますが、多大なエラーが発生しています。ブーストラムダを使用して静的メンバーにアクセスする

私はドキュメントをチェックしましたが、ラムダ式の静的変数std::string::nposにアクセスすることに疑念があります。私のコードの下に。

#include <boost/lambda/lambda.hpp> 
    #include <boost/lambda/core.hpp> 
    #include <boost/lambda/bind.hpp> 

int main(int argc, char** argv){ 
     typedef std::vector<std::string> array; 
     namespace bl = boost::lambda; 

     size_t (std::string::* fp)(const std::string&, size_t) const 
        = &std::string::find; 

     std::string to_find("AA"); 
     size_t pos = 0; 

     const char* data [] = { "AAAA","BBBB","","CCAACC","DDDDD" }; 
     array v(data, data +4); 
     assert(v.size() == 4); 
     std::replace_if(
       v.begin() 
       ,v.end() 
       , bl::bind( 
          fp 
          , bl::_1 
          , bl::constant_ref(to_find) 
          , bl::var(pos) 
        ) != bl::bind(&std::string::npos, bl::_1) 
       , "||" 
     ); 
     return 0; 
} 

私は比較

 != bl::bind(&std::string::npos, bl::_1) 
     to 
     != std::string::npos 

を変更した場合には罰金のビルドが、私は表現がうまく形成されているかどうかわからないです。時には、ラムダでの怠惰な評価のために、コールが遅延する可能性があるため、予想される結果(この場合ではなく、ラムダでの以前のテスト)を得られなかったことがあります。

boost lambdaで静的メンバーにアクセスする正しい方法は何でしょうか?

私は静的変数にアクセスするすべての

AFG

答えて

1

boost::constant_ref入力パラメータの署名に応じて、単純に次のよう

boost::constant(std::string::npos) 
boost::var(std::string::npos) 

のいずれかを使用して行うことができます。ありがとうございました

0

std::string::nposは、スタティックメンバーです。使用している文字列インスタンスに基づいて変化しません。 != std::string::nposの変更が正しいです。

boost::constantまたはboost::varを使用すると、静的メンバーの値の評価を遅らせることができます。修飾子がなければ、replace_ifのパラメータが評価されたときにその値が1回評価されます(v.begin()およびv.end()と同じ時刻)。バインドされた式が実行されるポイント(replace_if)まで評価を遅らせる必要がある場合は、boost::constantまたはboost::varを使用し、関数の途中で静的メンバーの値が変更された場合、それらの変更はバインドされた式。

関連する問題