【问题标题】:accessing static members using boost lambda使用 boost lambda 访问静态成员
【发布时间】:2011-07-06 00:01:42
【问题描述】:

我正在尝试使用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

【问题讨论】:

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


    【解决方案1】:

    可以使用以下方法之一访问静态变量

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

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

    【讨论】:

      【解决方案2】:

      std::string::npos 是一个静态 成员。它不会因您使用的字符串实例而异。您对使用 != std::string::npos 的更改是正确的。

      使用boost::constantboost::var 可以延迟对静态成员值的评估。如果没有任何修饰符,它的值将被评估一次,在评估 replace_if 参数时(与 v.begin()v.end() 相同)。如果您需要延迟计算直到绑定表达式被执行(在replace_if 内部),然后使用boost::constantboost::var,如果静态成员的值在函数过程中发生变化,这些变化将在绑定表达式中可见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 2021-08-19
        • 2021-11-26
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        相关资源
        最近更新 更多