2012-02-02 101 views
3

說我有下面的模板功能:傳遞一個複雜的功能參數變種

template <class T> 
void apply(const vector<complex<T> >& in, vector<T>& out, T (*f)(complex<T>)) 
{ 
    out.resize(in.size()); 
    for(size_t i = 0; i < in.size(); ++i) out[i] = f(in[i]); 
} 

你可以看到,我只是想給一個函數應用到複雜的數據向量,並將結果存儲到一個載體的實際數據。我認爲這應該是一個良好的整體功能列表:abs,norm,real,imag等

我的問題是,如何傳遞函數?

我試過apply(in, out, abs)的變種,向abs提供不同的模板,但沒有運氣。我很確定這個問題源於複雜的所有模板的功能,但我不知道如何正確傳遞它。謝謝您的幫助。

回答

4

問題是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>); 
+0

'pow'的模板*和*超載,但是它總是需要兩個參數。 – 2012-02-02 13:50:18

+0

我不知道'abs'和其他複雜函數需要'const&'。這似乎沒有一致記錄。現在所有的作品,謝謝。 – steveo225 2012-02-02 19:15:45

0

據我所知,你甚至都不需要去創造​​apply,你想要什麼可以std::transform做到:

#include <vector> 
#include <complex> 
#include <algorithm> 

int main(){ 
    std::vector<std::complex<double> > complex_vec(10); 
    std::vector<double> double_vec; 
    double_vec.resize(complex_vec.size()); 
    std::transform(complex_vec.begin(), complex_vec.end(), 
       double_vec.begin(), std::abs<double>); 
    return 0; 
} 
+0

我意識到,但我的真實功能還有很多,所提供的僅僅是一個小例子來說明問題。 – steveo225 2012-02-02 14:25:15

+0

@ steveo225:你的意思是你的'apply'函數做了更多的事情,或者你打算使用'apply'函數做更多的事情?如果第二個,很可能你仍然可以使用'transform'。 – 2012-02-02 16:48:43

+0

我的'apply'函數做得比示例更多,只需要一個簡單的例子 – steveo225 2012-02-02 19:13:49