2011-07-06 123 views
1

我想用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

回答

1

訪問一個靜態變量可以用簡單的下面

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

根據輸入參數簽名也boost::constant_ref之一來完成。

0

std::string::npos是一個靜態成員。它不會根據您使用的字符串實例而有所不同。您的更改使用!= std::string::npos是正確的。

使用boost::constantboost::var可讓您延遲評估靜態成員的值。如果沒有任何修飾符,則會在評估replace_if參數(與v.begin()v.end()同時)時評估其值,評估一次。如果您需要延遲評估直至執行綁定表達式(在replace_if之內),然後使用boost::constantboost::var,並且如果靜態成員的值在函數過程中發生更改,則這些更改將在綁定表達式中可見。