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

うまく構築されますが、表現がうまく形成されているかどうかはわかりません。ラムダでの遅延評価のために、呼び出しが遅延する可能性があるため、期待した結果が得られないことがありました(この場合ではなく、ラムダを使用した以前のテストで)。

ブーストラダで静的メンバーにアクセスする正しい方法は一般的に何であるか知っていますか?

みんなありがとう

AFG

4

2 に答える 2

1

静的変数へのアクセスは、次のいずれかを使用して実行できます。

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

入力パラメータの署名にもよりますがboost::constant_ref

于 2011-07-06T00:26:06.053 に答える
0

std::string::npos静的メンバーです。使用している文字列インスタンスによって異なりません。使用する変更!= std::string::nposは正しいです。

boost::constantまたはを使用boost::varすると、静的メンバーの値の評価を遅らせることができます。修飾子がない場合、その値は、パラメーターが評価されるときに(およびとreplace_if同じ時間に)一度評価されます。バインドされた式が実行されるポイント(の内部)まで評価を遅らせる必要がある場合は、またはを使用し、静的メンバーの値が関数の過程で変化する場合、それらの変更はバインドされた式の内部に表示されます。v.begin()v.end()replace_ifboost::constantboost::var

于 2011-07-06T18:46:36.577 に答える