我正在编写模板化音频类(带typename T
),用于音频操作,使用int16_t
或int8_t
二进制数据。 Lambda函数对我来说很新,所以我不知道用于计算均方根(RMS)的函数有什么问题。这是代码:
T calculate_RMS() {
return [&] () {
std::vector<T> squares;
for(int i = 0; i < this->data_vector.size(); ++i) {
squares.push_back(std::pow(this->data_vector[i], 2));
}
return std::sqrt(std::accumulate(squares.begin(), squares.end(), 0) / squares.size());
};
}
抛出的错误是:
audio.h: In instantiation of ‘T YNGMAT005::Audio<T>::calculate_RMS() [with T
= short int]’:
audiodriver.cpp:119:66: required from here
audio.h:178:5: error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS()
[with T = short int]::__lambda0’ to ‘short int’ in return
};
^
audio.h: In instantiation of ‘T YNGMAT005::Audio<T>::calculate_RMS() [with T = signed char]’:
audiodriver.cpp:122:65: required from here
audio.h:178:5: error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS()
[with T = signed char]::__lambda0’ to ‘signed char’ in return
make: *** [audiodriver.o] Error 1
我正在使用int8_t
测试此函数,所以我认为这就是为什么它说T是一个短整数。
由于
答案 0 :(得分:3)
固定宽度整数只是typedef
s,它们本身不是一种类型。在您的情况下,short int
正好是1个字节宽。
错误很明显:
error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS() [with T = short int]::__lambda0’ to ‘short int’ in return
无法将lambda转换为short int
。请记住,lambda只是一个函数对象,如果你想得到它的结果,你需要调用它:
return [&] () {
std::vector<T> squares;
for(int i = 0; i < this->data_vector.size(); ++i) {
squares.push_back(std::pow(this->data_vector[i], 2));
}
return std::sqrt(std::accumulate(squares.begin(), squares.end(), 0) / squares.size());
}();
^^^^
call the lambda
但你为什么要用lambda呢?它没有多大意义,因为你可以只取lambda的主体并将其作为函数的主体...这种技术(立即调用lambda)的唯一情况是当你需要初始化一些常量时从一个复杂的表达:
constexpr auto value = []() {
std::array<int, 10> result;
for (auto i = 0u; i < 10; ++i)
result[i] = i * 5;
return result;
}();