-2
任何想法如何重寫這個lambda函數pre C++ 11?lambda函數C++ 11
if (maxVol != 0)
std::transform(&spec[0], &spec[sampleSize], &spec[0]
, [maxVol] (float dB) -> float { return dB/maxVol; });
由於
任何想法如何重寫這個lambda函數pre C++ 11?lambda函數C++ 11
if (maxVol != 0)
std::transform(&spec[0], &spec[sampleSize], &spec[0]
, [maxVol] (float dB) -> float { return dB/maxVol; });
由於
使用bind1st和bind2nd(在C++ 11,我們將只使用綁定)用於 謂詞這也需要maxVol爲一體的輸入
創建一個函數對象,它可以有一個maxVol成員變量。 重載運算符()並將其作爲謂詞傳入。
原始代碼:
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);
}
我得到的錯誤:'FrequencyAnalysis :: DrawScene():: percent_of'沒有任何字段命名爲'maxVol'並且使用來自包含函數的'auto'變量。它無法識別std :: transform中的函數。任何幫助將不勝感激,謝謝。 – JasperK
第一個是由'maxVol'名稱中的拼寫錯誤造成的,第二個是忘記實際實例化'divides'。我糾正了這些。第三個錯誤僅僅源自前兩個,但代碼現在起作用,而不僅僅是指導。 http://coliru.stacked-crooked.com/a/8d8b42fa15ad94ba –
對不起,我仍然得到錯誤:'沒有匹配的函數調用'變換(浮動*,浮動*,浮動*,FrequencyAnalysis :: DrawScene():: percent_of)' – JasperK