2011-07-06 6 views
1

boost::lambda을 사용하여 간단한 조건자를 작성하려고하는데 많은 오류가 발생합니다.부스트 람다를 사용하여 정적 멤버에 액세스

나는 문서를 검사했는데 람다 식에서 정적 변수 std::string::npos에 액세스하는 데 의심의 여지가있다. 내 코드 아래. 내가 비교

 != bl::bind(&std::string::npos, bl::_1) 
     to 
     != 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; 
} 

. 때로는 람다의 게으른 평가로 인해 호출이 지연 될 수 있기 때문에 예상 결과를 얻지 못했습니다 (이 경우가 아니라 람다를 사용한 이전 테스트에서).

부스트 람다에서 정적 멤버에 액세스하는 올바른 방법은 무엇인지 알고 계십니까?

는 단순히 입력 매개 변수 서명도 boost::constant_ref에 따라 다음

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

중 하나를 사용하여 수행 할 수 있습니다 정적 변수에 액세스 당신에게 모든

AFG

답변

1

감사합니다.

0

std::string::npos정적입니다. 사용중인 문자열 인스턴스에 따라 달라지지 않습니다. != std::string::npos을 사용하기 위해 바뀌 었습니다.

boost::constant 또는 boost::var을 사용하면 정적 멤버의 값 평가를 지연 할 수 있습니다. 수정자를 사용하지 않으면, replace_if 매개 변수가 계산 될 때 (한 번 v.begin()v.end()과 같이) 해당 값이 한 번 평가됩니다. 바운드 표현식이 실행될 지점 (예 : replace_if)까지 평가를 지연해야하는 경우 boost::constant 또는 boost::var을 사용하고 정적 멤버의 값이 함수 과정에서 변경되면 바운드 식 내부에서 변경 내용을 볼 수 있습니다 .

관련 문제