доступ к статическим членам с помощью Boost Lambda - PullRequest
1 голос
/ 06 июля 2011

Я пытаюсь написать простой предикат, используя 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

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Доступ к статической переменной может быть выполнен с помощью одного из следующих

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

В зависимости от подписи входного параметра также boost::constant_ref.

0 голосов
/ 06 июля 2011

std::string::npos является статическим членом. Это не зависит от того, какой экземпляр строки вы используете. Ваше изменение для использования != std::string::npos является правильным.

Использование boost::constant или boost::var позволяет отложить оценку значения статического члена. Без каких-либо модификаторов его значение будет оцениваться один раз во время оценки параметров replace_if (одновременно с v.begin() и v.end()). Если вам нужно отложить оценку до момента, когда будет выполнено связанное выражение (внутри replace_if), тогда используйте boost::constant или boost::var, и если значение статического члена изменяется в течение функции, эти изменения будут быть видимым внутри ограниченного выражения.

...