使用boost lambda访问静态成员

时间:2011-07-06 00:01:43

标签: c++ stl static-members boost-lambda

我正在尝试使用boost::lambda编写一些简单谓词,并且我遇到了大量错误。

我检查了文档,我对访问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

它构建良好,但我不确定表达式是否形成良好。有时我发现,由于lambda中的懒惰评估,我没有得到预期的结果(不是在这种情况下,而是在之前的lambda测试中),因为调用可能会延迟。

您是否知道在boost lambda中访问静态成员的正确方法是什么?

我感谢你们所有人

AFG

2 个答案:

答案 0 :(得分:1)

只需使用以下其中一项

即可访问静态变量
 boost::constant( std::string::npos )
 boost::var( std::string::npos )

还取决于输入参数签名boost::constant_ref

答案 1 :(得分:0)

std::string::npos静态成员。它不会根据您使用的字符串实例而有所不同。您使用!= std::string::npos的更改是正确的。

使用boost::constantboost::var可以延迟评估静态成员的值。如果没有任何修饰符,则会在评估replace_if参数时(与v.begin()v.end()同时)评估其值。如果您需要将评估延迟到执行绑定表达式的位置(在replace_if内),则使用boost::constantboost::var,如果静态成员的值在整个过程中发生变化在函数中,这些更改将在绑定表达式中可见。