問題是std::abs
(來自<complex>
)將std::complex<T>
參數作爲參考到常量。你的函數指針只能用值來表示,這會導致不匹配。下面的代碼編譯就好:
#include <vector>
#include <complex>
template <class T>
void apply(const std::vector<std::complex<T> >& in, std::vector<T>& out,
T (*f)(std::complex<T> const&))
{
out.resize(in.size());
for(size_t i = 0; i < in.size(); ++i)
out[i] = f(in[i]);
}
int main(){
std::vector<std::complex<float> > vcomp;
std::vector<float> vf;
apply(vcomp, vf, &std::abs<float>);
}
Live example on Ideone.
一個更好的想法,但是,這是簡單地把函數類型作爲模板參數:
template <class T, class F>
void apply(const std::vector<std::complex<T> >& in, std::vector<T>& out, F f)
{
out.resize(in.size());
for(size_t i = 0; i < in.size(); ++i)
out[i] = f(in[i]);
}
Live example on Ideone.
無論如何,如果某個功能的模板爲,您有時可能需要在演員現場用歧義消除歧義,以及超負荷(我不記得<complex>
功能,但你永遠不知道)。
// taking std::abs as an example. It's not actually templated *and* overloaded
typedef float (*func_ptr)(std::complex<float> const&);
apply(vcomp, vf, (func_ptr)&std::abs<float>);
來源
2012-02-02 13:35:56
Xeo
'pow'的模板*和*超載,但是它總是需要兩個參數。 – 2012-02-02 13:50:18
我不知道'abs'和其他複雜函數需要'const&'。這似乎沒有一致記錄。現在所有的作品,謝謝。 – steveo225 2012-02-02 19:15:45