我正在尝试使用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
答案 0 :(得分:1)
只需使用以下其中一项
即可访问静态变量 boost::constant( std::string::npos )
boost::var( std::string::npos )
还取决于输入参数签名boost::constant_ref
。
答案 1 :(得分:0)
std::string::npos
是静态成员。它不会根据您使用的字符串实例而有所不同。您使用!= std::string::npos
的更改是正确的。
使用boost::constant
或boost::var
可以延迟评估静态成员的值。如果没有任何修饰符,则会在评估replace_if
参数时(与v.begin()
和v.end()
同时)评估其值。如果您需要将评估延迟到执行绑定表达式的位置(在replace_if
内),则使用boost::constant
或boost::var
,如果静态成员的值在整个过程中发生变化在函数中,这些更改将在绑定表达式中可见。