2014-04-06 102 views

回答

0
  1. 使用bind1st和bind2nd(在C++ 11,我們將只使用綁定)用於 謂詞這也需要maxVol爲一體的輸入

  2. 創建一個函數對象,它可以有一個maxVol成員變量。 重載運算符()並將其作爲謂詞傳入。

  3. 使用boost lambda。
5

原始代碼:

if (maxVol != 0) 
     std::transform(&spec[0], &spec[sampleSize], &spec[0], [maxVol] (float dB) -> float { return dB/maxVol; }); 

LAMBDA:

[maxVol] (float dB) -> float { return dB/maxVol; } 

置換拉姆達:

struct percent_of { 
    //that lambda captures maxVol by copy when constructed 
    percent_of(float maxVol) : maxVol(maxVol) {} 
    //the lambda takes a "float dB" and returns a float 
    float operator()(float dB) const { return dB/maxVol; } 
private: 
    float maxVol; 
}; 

置換全碼:

if (maxVol != 0) 
     std::transform(&spec[0], &spec[sampleSize], &spec[0], percent_of(maxVol)); 

但是,這個lambda非常簡單,現在它被構建到標準庫中。 Pre-C++ 11在boost中有這些完全相同的位。

if (maxVol != 0) { 
    using std::placeholders::_1; 
    auto percent_of = std::bind(std::divides<float>(), _1, maxVol); 
    std::transform(&spec[0], &spec[sampleSize], &spec[0], percent_of); 
} 
+0

我得到的錯誤:'FrequencyAnalysis :: DrawScene():: percent_of'沒有任何字段命名爲'maxVol'並且使用來自包含函數的'auto'變量。它無法識別std :: transform中的函數。任何幫助將不勝感激,謝謝。 – JasperK

+0

第一個是由'maxVol'名稱中的拼寫錯誤造成的,第二個是忘記實際實例化'divides'。我糾正了這些。第三個錯誤僅僅源自前兩個,但代碼現在起作用,而不僅僅是指導。 http://coliru.stacked-crooked.com/a/8d8b42fa15ad94ba –

+0

對不起,我仍然得到錯誤:'沒有匹配的函數調用'變換(浮動*,浮動*,浮動*,FrequencyAnalysis :: DrawScene():: percent_of)' – JasperK