2012-05-31 47 views
0

我有一個Visual Studio 2008的C++ 03應用程序,我想使用boost :: lambda來執行此操作:與方法,用升壓lambda表達式

enum { fooflag = 0x00000001; } 

bool IsFooFlagActive(DWORD flags) 
{ 
    return (flags & fooflag) != 0; 
} 

不幸的是,這並不工作:

namespace bl = boost::lambda; 
bool is_foo_flag_active = ((bl::_1 & fooflag) != 0)(0x00000001); 

獲得boost :: lambda來執行復合表達式的正確方法是什麼?我是否需要綁定!=運算符?

感謝

+0

爲什麼fooFlag是枚舉而不是DWORD? –

+1

@AlessandroPezzato:因爲定義一個枚舉類型保證不使用任何存儲;對於整型類型也是如此,即使它們是「靜態常量」。 – ildjarn

+0

@ildjarn謝謝你,純粹的好奇:) –

回答

2

我不知道潛在的問題是什麼,但加入了鑄使得它的工作:

namespace bl = boost::lambda; 
bool is_foo_flag_active = 
    ((bl::_1 & static_cast<DWORD>(fooflag)) != 0)(0x00000001); 

話雖這麼說,停在新代碼–使用Boost.Lambda它已經正式棄用(除文件外),贊成Boost.Phoenix近一年,並有充分的理由。 (並且您的代碼在使用Phoenix而不是Lambda時按原樣編譯)

+1

什麼是「除了文檔都正式廢棄」是什麼意思?這是否意味着他們已經不推薦使用它,而不必在自己的文檔中提及它已被棄用,所以您只能通過口耳相傳和Boost郵件列表瞭解它?如果是這樣,那在我看來,究竟是什麼*非官方的*棄用看起來像;-) –

+1

@Steve:你說得對,但這是因爲沒有人能夠聯繫Jaakko來更新文檔。 Jaakko很早就同意了,只要Phoenix作爲一個獨立庫被髮布,它將取代Lambda,因此所有Boost作者,甚至Jaakko都同意它已被棄用 - 這僅僅是一個文檔錯誤。 – ildjarn

+1

嘿,這是一個很不錯的SFANU。被拋棄的東西,你甚至無法修復文檔說它被放棄! –